我正在尝试编写一个脚本,当有人通过 ssh 登录机器时通知用户。
我目前的想法是在间隔中使用 grep 解析“w”的输出。
但这既不优雅也不高效。有没有人更好地了解如何实施这样的程序?
任何帮助将不胜感激!
Paul Tomblin 的建议是正确的。
在您的 sshd_config 中设置日志记录以指向您可以单独记录的系统日志工具:
=> 查看 man 3 syslog 了解更多功能。选择一个,例如
# Logging
SyslogFacility local5
LogLevel INFO
然后像这样设置你的 syslog.conf:
local5.info |/var/run/mysshwatcher.pipe
将您要写入的脚本添加到 /etc/inittab 以使其继续运行:
sw0:2345:respawn:/usr/local/bin/mysshwatcher.sh
然后写你的脚本:
#!/bin/sh
P=/var/run/mysshwatcher.pipe
test -p $P || mkfifo $P
while read x <$P; do
# ... whatever, e.g.:
echo "ssh info: $x" | wall
done;
最后,重新启动您的 syslogd 并重新加载您的 inittab (init q),它应该可以工作。如果使用这些服务的其他变体,则需要相应地进行配置(例如 newsyslogd => /etc/newsyslog.conf;Ubuntu:/etc/event.d 而不是 inittab)
这是非常基本的和缺乏的,但应该足以让你开始......
更多信息:man sshd_config 以获得更多日志记录选项/详细信息。
在 Ubuntu 上(我猜所有其他 Debian 发行版,如果不是所有的 Linuces 的话),文件 /var/log/auth.log 记录成功(和不成功)的登录尝试:
sshd[XXX]: pam_unix(sshd:session): session opened for user XXX
您可以使用此命令设置一个非常简单的监视器(请注意,您必须是 root 才能查看身份验证日志):
sudo tail -F /var/log/auth.log | grep sshd
如果您不关心他们是如何登录的(telnet/ssh),“last”Unix 命令行实用程序会向您显示机器上的最后几次登录。远程用户将显示 IP 地址
[root@ex02 www]# last foo pts/1 81.31.xy Sun Jan 18 07:25 仍然登录
foo pts/0 81.31.xy Sun Jan 18 01:51 仍然登录
foo pts/0 81.31.xy Sat Jan 17 03:51 - 07:52 (04:00)
bar pts/5 199.146.xy 1 月 16 日星期五 08:57 - 13:29 (04:32)
设置一个命名管道,并设置一个日志文件解析器来监听它,并将 ssh 消息发送给它。日志文件解析器可以做你想做的事,或者发信号给一个守护进程去做。
重定向日志文件是在 /etc/ 中的配置文件中完成的,其名称现在让我无法理解。/etc/syslog.conf,我想。
我制作了一个程序(我称之为身份验证监视器)来解决问题中描述的任务。
如果您愿意,非常欢迎您下载它来研究我如何解决这个问题(使用日志文件)。
您可以在这里免费找到身份验证监视器:http ://bwyan.dk/?p=1744