用户通过SSH从特定主机登录时执行操作

时间:2012-10-08 19:28:59

标签: linux bash ssh profile

我有一个困扰我的问题,我想知道是否有人试图实现以下目标:

我们假设这是我在Linux环境中使用'last'命令的结果:

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)   

如果'root'用户已从192.168.1.10登录,如何设置特定操作(例如修改的MOTD或发送电子邮件)。有没有办法捕获这些信息?

这个问题的第二部分是如何使上述检查更加健壮 - 即如果我有以下内容:

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)      

现在我想在用户名等于'mary'且主机为192.168.1.10时执行操作。

欢迎任何建议。

提前谢谢。

6 个答案:

答案 0 :(得分:17)

有一个特殊文件/etc/ssh/sshrc,您可以在其中放置一些命令,每次有人通过ssh连接时都会运行这些命令。我是为你写的:

#!/bin/bash

mail=user@domain.tld
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:       用户在ssh中执行此文件中的命令       在用户的shell(或命令)启动之前登录。见       sshd(8)手册页了解更多信息。

答案 1 :(得分: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 root@your-host who am i然后打印“你的主机”,但我认为这是应该是这样的。

毋庸置疑,可以修改上述sed语句,以便您也可以捕获用户名,并且可以扩展if/else语句以满足您的需求。

再次感谢您的回复。

答案 2 :(得分: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

答案 3 :(得分:0)

您可以根据/etc/profile的值向$SSH_CLIENT或等效内容添加内容。

答案 4 :(得分: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

这些会话都不是活跃的,而是历史性的和记录的。

答案 5 :(得分:0)

在ubuntu我把一个脚本放在

/etc/profile.d

当有人(用户ssh)登录时,它会向我的邮件发送电子邮件

#/etc/profile.d/run_on_loggin.sh
echo $(who i am) | mail -s 'SSH Login Notification' mymail@hotmail.com

我想用smtp创建一个php文件,用我的邮件发送电子邮件给我... 有时候hotmail会保存在垃圾邮件中......

如果我有php文件,我会像this ...

一样运行

如果我想将var传递给文件php运行,如this ...

原谅我的英语:3

注意:我认为此命令是从用户运行的,如果用户没有权限使用某些命令或发送电子邮件,请小心。