问题描述
有没有人有一个bash脚本,在成功登录ssh服务器的情况下会发送电子邮件或通知某人?如果有人登录我的个人邮箱,我希望收到通知。
我正在使用运行xfce的Ubuntu 12.04
最佳解决思路
Warning: according to the comments, this does not work if the user creates a file called
~/.ssh/rc
.*
使用以下内容修改或创建/etc/ssh/sshrc
:
ip=`echo $SSH_CONNECTION | cut -d " " -f 1`
logger -t ssh-wrapper $USER login from $ip
echo "User $USER just logged in from $ip" | sendemail -q -u "SSH Login" -f "Originator <from@address.com>" -t "Your Name <your.email@domain.com>" -s smtp.server.com &
只要有人通过SSH登录,这将有效地通过电子邮件通知您,登录将记录在syslog中。
注意:您需要sendemail
软件包(sudo apt-get install sendemail
)才能使电子邮件通知正常工作。
注意:适用于端口转发,但不使用-N选项。
次佳解决思路
Warning: As always when you change the login configuration, leave a backup ssh session open in the background and test the login from a new terminal.
由于如果用户拥有自己的~/.ssh/rc
文件,sshrc
方法不起作用,我将解释如何使用pam_exec
执行此操作,如@adosaiguas建议的那样。好处是,通过挂接到/etc/pam.d/
中的不同文件,这也可以很容易地适应ssh
以外的登录类型(例如本地登录甚至所有登录)。
首先,您需要能够从命令行发送邮件。还有其他问题。在邮件服务器上,最简单的方法是安装mailx
(可能已经安装了)。
然后你需要一个可执行的脚本文件login-notify.sh
(例如我把它放在/etc/ssh/
中),内容如下。您可以更改变量以更改e-mail通知的主题和内容。不要忘记执行chmod +x login-notify.sh
以使其可执行。
#!/bin/sh
# Change these two lines:
sender="sender-address@example.com"
recepient="notify-address@example.org"
if [ "$PAM_TYPE" != "close_session" ]; then
host="`hostname`"
subject="SSH Login: $PAM_USER from $PAM_RHOST on $host"
# Message to send, e.g. the current environment variables.
message="`env`"
echo "$message" | mailx -r "$sender" -s "$subject" "$recepient"
fi
完成后,您可以将以下行添加到/etc/pam.d/sshd
:
session optional pam_exec.so seteuid /path/to/login-notify.sh
出于测试目的,该模块包含在optional
中,因此如果执行失败,您仍然可以登录。确认它有效后,可以将optional
更改为required
。除非执行钩子脚本成功(如果这是你想要的),否则无法登录。
对于那些需要解释PAM是什么以及如何工作的人,here is a very good one。
第三种解决思路
我们一直在使用monit来监控linux盒子上的进程。 monit也可以通过电子邮件提醒您通过ssh成功登录。我们的monit配置如下所示
check file ssh_logins with path /var/log/auth.log
# Ignore login's from whitelist ip addresses
ignore match "100.100.100.1"
# Else, alert
if match "Accepted publickey" then alert
注意:应在monitrc
文件中设置邮件服务器配置,电子邮件格式等
更新:在此上写了更详细的blog post
第四种思路
将以下内容放入/etc/profile
:
if [ -n "$SSH_CLIENT" ]; then
TEXT="$(date): ssh login to ${USER}@$(hostname -f)"
TEXT="$TEXT from $(echo $SSH_CLIENT|awk '{print $1}')"
echo $TEXT|mail -s "ssh login" you@your.domain
fi
脚本如何工作
每次登录时都会执行/etc/profile
(对于bash shell用户)。如果用户已通过ssh登录,则if语句将仅返回true,这反过来将导致缩进的代码块运行。
接下来,我们构建消息的文本:
-
$(date)
将被date
命令的输出替换 -
${USER}
将替换为用户的登录名 -
$(hostname -f)
将被登录系统的完整主机名替换
第二个TEXT
行添加到第一行,提供该用户登录的系统的IP地址。最后,生成的文本将通过电子邮件发送到您的地址。
总结默认情况下,Linux将在系统日志文件中记录每个系统登录,无论是否通过ssh,但有时 – 特别是对于通过ssh很少访问的系统 – 快速而脏的通知可能很有用。
第五种思路
在这个其他question你可能有你想要的。基本上,您可以在用户通过ssh登录时运行的脚本中添加对mail command的调用:/etc/pam.d/sshd