2012-10-08 170 views
9

我有一个困惑我quesiton,我不知道是否有人试图实现以下目标:执行操作

让我们假设这是我的“最后”的结果命令在Linux环境:

root pts/1  192.168.1.10  Wed Feb 10 07:04 - 07:57 (00:52) 
root pts/2       Tue Feb 9 22:00 - 00:13 (02:13) 

我怎样才能设置一个特定的动作(例如说修改MOTD或发送电子邮件)如果“根”用户从192.168.1.10登录。有没有办法获取这些信息?

这个问题的第二部分是,我怎样才能使上面的检查更健壮一点 - 即,如果我有以下几点:

mary pts/1  192.168.1.10  Wed Feb 10 07:04 - 07:57 (00:52) 
bob pts/2       Tue Feb 9 22:00 - 00:13 (02:13)  

现在我想执行,如果用户名行动等于'玛丽',主机是192.168.1.10。

欢迎任何建议。

预先感谢您。

回答

1

感谢您的答复。最终我设法找到了一个暂时可行的解决方案,但它确实有一个缺陷,我会在一分钟内指出。

我加入以下到我的/ etc/.bashrc的文件(或者/etc/bash.bashrc你使用任何环境):

HOST="192.168.0.1" 
RHOST=`who am i | sed -n 's/.*(\([^) ]*\).*/\1/p; 1q'` 
if [ "$RHOST" == "$HOST" ]; then 
     echo "SAY WHAT!" 
     #add further actions here if needed 
fi 

,我是之前谈论实际上可能不是缺陷是一个缺陷。如果你已经通过SSH连接到系统中,并且你想SSH连接到一个生活在同一个IP上的主机,比如说ssh [email protected]who am i会打印'your-host',但我认为这是它应该的样子。

不用说,上面的sed语句可以修改,以便您可以捕获用户名,并且您可以扩展if/else语句以满足您的需求。

再次感谢您的回复。

+0

你测试了我的'sshrc'文件吗? =) –

+0

我喜欢你的解决方案以及sputnick,谢谢! :) – Tamas

+0

嗨sputnick。我们到达了2级:)你知道如何排除记录来自cronjobs /代码片段的ssh命令。我只对用户从控制台登录感兴趣。谢谢。 – Tamas

0

一种方法是定期运行一个简单的脚本:

#!/bin/bash 
users=$(last | sed -ne '/192\.168\.1\.10/ s/\([^ ]*\).*/\1/p') 
for user in $users; do 
    sendmail "$user" < email.txt 
done 

这将管道的最后一个命令到sed将提取用户列表,并将其保存到变量$users。 sed命令使用-n标志,因此它只打印我们告诉它的内容。首先,我们选择包含指定IP的行,并使用/192\.168\.1\.10/“地址”。在这些方面,我们试图在空格之前提取字符,如果我们成功,我们会打印结果。

然后,我们可以遍历$users变量并相应地采取行动。

反复调用此方法的一种方法是通过cron,更简单的方法是执行while true; do ./my_script.bash; sleep 60; done

+0

Re cron vs while,而不是使用inotifywait检测/ var/log/wtmp中的更改。 –

+0

谢谢Janito。我认为必须有更多的“互动”。我的想法是,如果最后一次使用某个ssh-s值更新lastlog,那么可以捕获相同的信息,然后将其放入/etc/bash.bashrc文件中,以便在登录时调用它。 – Tamas

0

您可以在/etc/profile或其他等效物上添加一些东西,这取决于$SSH_CLIENT的值。

0

看起来您正在使用last,因为它默认读取/var/log/wtmp这是登录记录。 who命令还允许您阅读相同的文件,但使用界面更符合您的需求。

例如:

$ who --ips /var/log/wtmp | grep '^msw.*127.0.0.1' 
msw  pts/2  2012-10-07 15:52 127.0.0.1 
msw  pts/3  2012-10-07 15:55 127.0.0.1 

那里既没有这些会议的活跃,而是历史和记录。

15

有一个特殊的文件/etc/ssh/sshrc你可以放一些命令,每次有人连接时运行ssh。我写的你:

#!/bin/bash 

[email protected] 
monitored_user=root 
monitored_ip=x.x.x.x 

hostname=$(hostname) 

# add a welcome message: 
printf >&2 "\nWelcome on $hostname $USER\n" 

read -d " " ip <<< $SSH_CONNECTION 

[[ $ip == $monitored_ip && $USER == $monitored_user ]] || exit 0 

date=$(date "+%d.%m.%Y %Hh%M") 
reverse=$(dig -x $ip +short) 

mail -s "Connexion of $USER on $hostname" $mail <<EOF 

IP: $ip 
Reverse: $reverse 
Date: $date 
EOF 

将这个脚本文件,然后把脚本的完整路径/etc/ssh/sshrc

man ssh

/etc/ssh/sshrc : Commands in this file are executed by ssh when the user logs in, just before the user's shell (or command) is started. See the sshd(8) manual page for more information.

+0

把这个脚本放在一个文件中,然后把脚本的完整路径放在'/ etc/ssh/sshrc'中,因为sshrc文件不处理bash测试。 POST相应编辑。 –

+1

我有一个“语法错误:意外重定向”。第12行。 – Sergey

+0

我遇到了与@Sergey相同的问题。另外,它似乎不喜欢'[['。我在脚本中试着'echo $ SHELL'来确认它是bash。 FWIW'['工作。哦,并且'dig'没有安装。 – Sparhawk

0

在Ubuntu我把脚本

/etc/profile.d 

当有人(用户SSH)登录,它发送邮件到我的邮箱

#/etc/profile.d/run_on_loggin.sh 
echo $(who i am) | mail -s 'SSH Login Notification' [email protected] 

我想创建一个PHP文件smtp,发送电子邮件与我的邮件给我... hotmail保存在垃圾邮件的一些时间...

如果我有php文件我将运行像this ...

,如果我想通过VAR到文件运行PHP喜欢this ...

原谅我的英文:3

注:我觉得从用户使用此命令运行,仔细如果用户doen't有权使用某些命令或发送电子邮件。