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

12

有一个问题让我感到困惑,我想知道是否有人尝试过以下操作:

假设这是在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个回答

23

有一个特殊的文件 /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
将此脚本放入文件中,然后将脚本的完整路径放入“/etc/ssh/sshrc”中,因为sshrc文件无法处理bash测试。相应地进行POST编辑。 - Gilles Quénot
我遇到了与@Sergey相同的问题。此外,它似乎不喜欢“[[”。我尝试在脚本中使用“echo $ SHELL”来确认它是bash。FWIW“[”有效。哦,而且“dig”没有安装。 - Sparhawk
因为正如我之前所说,你必须将这个脚本放在一个文件中而不是直接放在sshrc中。sshrc必须包含可执行脚本的完整路径。 - Gilles Quénot
这个脚本是为所有用户准备的,他们登录时会用到吗? - DarckBlezzer
当然,测试一下你就会看到。 - Gilles Quénot
我已在树莓派OS Lite上进行了测试,发现只有在没有~/.ssh/rc的情况下,/etc/ssh/sshrc才会在登录时运行。此外,这些文件中的任何一个存在似乎都会阻止其他机器上的rsync。 - john-jones

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-hostwho am i将打印“your-host”,但我认为这应该是正确的方式。
不用说,上述的sed语句可以修改,以便您也可以捕获用户名,并且您可以扩展if/else语句以满足您的需求。
再次感谢您的回复。

你测试过我的 sshrc 文件了吗?=) - Gilles Quénot
嗨,sputnick。我们即将进入第二级 :) 你知道如何排除来自cronjobs/代码片段的ssh命令记录吗?我只对从控制台登录的用户感兴趣。谢谢。 - Tamas

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 这样运行它...

如果我想将变量传递给php文件,则可以像 this 运行...

请原谅我的英语 :3

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


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

这两个会话都不是活动状态,而是历史记录和日志记录。


0

您可以将一些内容添加到 /etc/profile 或类似的文件中,根据 $SSH_CLIENT 的值执行不同操作。


-1
一种方法是定期运行一个简单的脚本:
#!/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


不要使用 cron 和 while,而是使用 inotifywait 来检测 /var/log/wtmp 中的更改。 - James Waldby - jwpat7
谢谢Janito。我认为应该有更多的“交互性”。我的想法是,如果最后登录记录在某人通过ssh登录到服务器时更新了一个值,那么这个信息可以被捕获并放入/etc/bash.bashrc文件中,以便在登录时调用它。 - Tamas

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接