停止 ssh 登录从客户端打印 mod?

停止 ssh 登录从客户端打印 mod?

我已经设置了无密码 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 打印的。如果是这种情况,那么您可能无法从客户端控制它。

相关内容