我已经设置了无密码 SSH,但是它在登录时会打印 MoTD。有没有办法从客户端阻止这种情况发生?
我试过了ssh -q
,但没用。我不想使用,~/.hushlogin
也不想更改服务器设置。唯一可行的方法是使用 来使所有输出安静>/dev/null 2>&1
。但是,如果真的有问题,我不想忽略错误。即使这样做也>/dev/null
不起作用,因为ssh
似乎将 motd 打印到 stderr。
更新与推理我正在 cron 中运行备份。除非发生错误,否则我不想收到 cron 电子邮件。但是,如果打印了 motd,我将始终收到电子邮件。
我想让 motd 一直打印,因为这有法律含义。motd 上写着“禁止未经授权的访问”。你需要在其中添加这样的声明,才能合法地阻止人们访问它(就像禁止非法侵入的标志一样)。因此,我不想一直全面禁用它。
答案1
我不确定你为什么不愿意正确地做这件事——无论是在服务器上
PrintMotd no
PrintLastLog no
和
#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session optional pam_motd.so
或者为每个用户添加 ~/.hushlogin。
提示,对于 ~/.hushlogin,将其添加到 /etc/skel,以便使用该文件创建新的用户主目录。
更新:
由于没有关于备份 cron 作业的更多信息,我唯一的其他建议是将命令的输出重定向到文件(或让 cron 将其捕获到电子邮件中),并将 ssh 会话的输出重定向到 /dev/null。类似于:
0 0 * * * ssh backuphost "backup_script_that_writes_to_a_log" >/dev/null
或者
0 0 * * * ssh backuphost "backup_command 2>&1" >/dev/null
我需要稍微尝试一下这些命令,但这应该可以帮助你入门。
答案2
connectionString
@note 所有示例都假设您已经设置了类似这样的变量connectionString=user@server
。
我如何找到解决方案
使用ssh -T
应该适用于简单命令。例如,这不会打印任何额外信息:
ssh -T $connectionString "echo 'blah'"
问题在于当您尝试使用 here-doc 运行许多命令时。例如 - bellow 将不起作用 - 它将回显当天的消息 (MoTD),还可能向您显示“stdin:不是 tty”。
somethingLocal='something local'
ssh -T $connectionString <<EOC
echo 'blah'
echo "blah $somethingLocal"
EOC
要解决这个问题,您首先需要将命令保存到本地变量,然后将其发送到远程服务器。
somethingLocal='something local'
read -r -d '' commands <<EOC
echo 'blah'
echo "blah $somethingLocal"
EOC
ssh -T $connectionString "$commands"
但这太乱了...
最终解决方案
制作一个通用函数(注意,它可以接受字符串或 HEREDOC 作为命令)。
function silentSsh {
local connectionString="$1"
local commands="$2"
if [ -z "$commands" ]; then
commands=`cat`
fi
ssh -T $connectionString "$commands"
}
例子
像这样使用:
somethingLocal='something local'
silentSsh $connectionString <<EOC
echo 'blah'
echo "blah $somethingLocal"
EOC
或者像这样:
silentSsh $connectionString "echo 'blah'"
或者像这样:
silentSsh $connectionString <<'EOC'
echo 'blah'
somethingRemote=`echo 'whatever'`
echo "blah $somethingRemote"
EOC
或者甚至像这样:
silentSsh $connectionString < getlines.sh
答案3
如果您希望基于每个用户执行此操作,则只需执行 a,touch ~/.hushlogin
然后就可以使用 OpenSSH 进行设置。
更新:正如其他地方指出的那样,pam_motd
可能配置为不使用每个用户.hushlogin
;检查/etc/login.defs
。它可能配置为在或类似HUSHLOGIN_FILE
中列出所有用户。/etc/hushlogins
答案4
这是什么操作系统?在某些系统(如 ubuntu)上,motd 不是由 ssh 服务器(/etc/ssh/sshd_config 中的 PrintMotd)打印的,而是由 pam 和 pam_motd 打印的。如果是这种情况,那么您可能无法从客户端控制它。