ssh forcecommand 与 xxx 的连接已关闭

ssh forcecommand 与 xxx 的连接已关闭

我正在为我的服务器设置一个 ssh 通知系统。目的是让 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);

?>

(我选择 php 只是因为我比原始 shell 脚本更精通它)

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

Connection to xxx closed.

但是,如果我注释掉 sshd_config 中的 forcecommand 行,那么我就可以再次登录。显然,我希望能够登录并给自己发送电子邮件。

哦,还有:

$ 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 中的关键内容。我以为可能是 pam,但我用以下行关闭了 pam

UsePAM no

并且在/etc/ssh/sshd_config客户端仍然收到相同的“连接关闭”消息。

有人遇到过这个问题吗?有人可以提出解决办法吗?

替代解决方案

我不确定为什么 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

答案1

它正在做确切地您告诉它做什么。sshd 不会运行用户请求的命令(可能是 shell),而是强制运行命令,即您的脚本。您的脚本执行一些操作(发送电子邮件),然后退出。由于 SSH 会话执行的命令现已完成,因此连接已关闭。

如果您仍想执行用户请求的命令,则您的脚本有责任实现这一点。原始命令在SSH_ORIGINAL_COMMAND环境变量中传递给脚本,因此您的脚本必须在发送电子邮件后明确执行此命令。

不过,针对此特定用例的 PAM 解决方案要好得多。

相关内容