ssh forcecommand连接到xxxclosures

我正在为我的服务器设置一个ssh通知系统。 每当我login到我的服务器之一,希望能够捕获入侵者,sshd给我发送一封电子邮件的目的。 我使用的是Ubuntu 10.04和11.04。

/etc/ssh/sshd_config我添加了以下行:

 ForceCommand /usr/local/scripts/ssh_notifications.php 

并且这个文件的内容是:(注意我用xxx代替了私有的东西 – 这些不是我的shell中显示的实际值)

 #!/usr/bin/php <?php $remote_host_ip = trim(shell_exec('echo $SSH_CONNECTION')); $remote_host = strlen($remote_host_ip) ? "ip $remote_host_ip" : "unknown ip address"; $localhost = php_uname('n'); $now = str_replace('T', ' ', date('c')); $to = '[email protected]'; $subject = "$localhost accessed via ssh"; $body = "date: $now, by: $remote_host"; //die("subject: [$subject], body: [$body]"); //debug use only mail($to, $subject, $body); exit(0); ?> 

(我select了PHP只是因为我比熟练的shell脚本更精通)

然后我问sudo /etc/init.d/ssh restart启动我的sshd并尝试远程访问服务器。 当我这样做时,电子邮件正确地发送到我的收件箱,但我得到以下错误,我无法访问我的服务器:

 Connection to xxx closed. 

但是,如果我注释掉sshd_config中的forcecommand行,那么我可以再次login罚款。 显然我希望能够login以及发送自己的电子邮件。

哦,还有:

 $ tail -5 /var/log/auth.log Aug 22 12:33:32 xxxx sudo: xxxx : TTY=pts/0 ; PWD=/usr/local/scripts ; USER=root ; COMMAND=/usr/bin/vi /etc/ssh/sshd_config Aug 22 12:33:38 xxxx sshd[6863]: Accepted publickey for xxxx from 192.168.0.2 port 39446 ssh2 Aug 22 12:33:38 xxxx sshd[6863]: pam_unix(sshd:session): session opened for user xxxx by (uid=0) Aug 22 12:33:38 xxxx sshd[6941]: Received disconnect from 192.168.0.2: 11: disconnected by user Aug 22 12:33:38 xxxx sshd[6863]: pam_unix(sshd:session): session closed for user xxxx 

这让我觉得,forcecommand是重写sshd中至关重要的东西。 我认为这可能是帕姆,但我closures线路帕姆

 UsePAM no 

/etc/ssh/sshd_config ,仍然在客户端收到相同的“连接closures”消息。

有没有人有过这个问题,谁能提出一个解决scheme?

备用解决scheme

我不知道为什么ssh forcecommand不起作用,但我设法用pam_exec实现我想要的(通过ssh访问的电子邮件通知),如下所示:

 $ grep -B 2 -A 1 php /etc/pam.d/sshd # run ssh notification script upon successful login session optional pam_exec.so /usr/local/scripts/ssh_notifications.php $ sudo /etc/init.d/ssh restart 

正是你要做的。 而不是运行用户请求的命令(可能是一个shell),sshd强制执行命令,即脚本。 您的脚本会执行一些操作(发送电子邮件),然后退出。 由于SSH会话执行的命令现在已经完成,连接就closures了。

如果您仍想执行用户所请求的命令,则脚本有责任将其执行。 原来的命令被传递给SSH_ORIGINAL_COMMAND环境variables中的脚本,所以你的脚本在发送邮件之后必须明确地执行这个命令。

这个特定用例的PAM解决scheme更好。