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

Ama*_*rus 51 linux ssh bash

我已经设置了 SSH 无密码设置,但是它会在登录时打印 MoTD。无论如何从客户端阻止这种情况发生?

我试过了,ssh -q但这不起作用。我不想使用~/.hushlogin也不想更改服务器设置。唯一可行的方法是使用>/dev/null 2>&1. 但是,如果确实存在问题,我不想忽略错误。即使这样做>/dev/null也不起作用,因为ssh似乎将 motd 打印到 stderr。

更新和推理我在 cron 中运行备份。除非发生错误,否则我不想收到 cron 电子邮件。但是,如果打印了 motd,我会一直收到一封电子邮件。

我想继续打印 motd,因为这具有法律含义。motd 说“禁止未经授权的访问”。你需要在那里有这样的声明,以合法地阻止人们访问它(就像一个禁止侵入的标志)。因此,我不想一直全面禁用它。

jti*_*man 60

我不知道你为什么不喜欢正确地做这件事——要么在服务器上

PrintMotd no
PrintLastLog no
Run Code Online (Sandbox Code Playgroud)

#/etc/pam.d/ssh
# Print the message of the day upon successful login.
# session    optional     pam_motd.so
Run Code Online (Sandbox Code Playgroud)

或者为每个用户添加 ~/.hushlogin。

提示,对于 ~/.hushlogin,将其添加到 /etc/skel 以便使用该文件创建新的用户主目录。

更新:

如果没有关于备份 cron 作业的更多信息,我唯一的其他建议是将命令的输出重定向到一个文件(或让 cron 在电子邮件中捕获它)并将 ssh 会话的输出重定向到 /dev/null。就像是:

0 0 * * * ssh backuphost "backup_script_that_writes_to_a_log" >/dev/null
Run Code Online (Sandbox Code Playgroud)

或者

0 0 * * * ssh backuphost "backup_command 2>&1" >/dev/null
Run Code Online (Sandbox Code Playgroud)

我不得不稍微玩弄这些命令,但这应该会让你开始。

  • 我不想从服务器中删除它,因为出于法律原因我需要在那里保留“禁止授权访问”的通知。 (16认同)
  • 我喜欢“做对了”。 (4认同)
  • Fwiw,该通知并不能阻止未经授权的访问,它只是通知人们您可以(并且将)采取适当的法律行动,并且可能正在监视他们的使用,就像有关记录电话交谈的通知一样。 (3认同)
  • `.hushlogin` 很好 (3认同)

tow*_*owo 19

如果您希望在每个用户的基础上进行此操作,只需执行一个操作,即可touch ~/.hushlogin使用 OpenSSH 进行设置。

更新:正如其他地方所指出的,pam_motd可能被配置为不使用每个用户.hushlogin;检查/etc/login.defsHUSHLOGIN_FILE。它可以配置为列出所有用户/etc/hushlogins或类似的。

  • 我试过了,但没有用。正如其他人指出的那样,motd 可能是从 pam 打印的 (2认同)

Nux*_*Nux 17

@note 所有示例都假设您已经设置了一个connectionString类似connectionString=user@server.

我是如何找到解决方案的

使用ssh -T应该适用于简单的命令。例如,这不会打印任何额外信息:

ssh -T $connectionString "echo 'blah'"
Run Code Online (Sandbox Code Playgroud)

问题是当您尝试使用 here-doc 运行许多命令时。例如 - 波纹管将不起作用 - 它会回显当天的消息(MoTD)并且还可能向您显示“标准输入:不是 tty”。

somethingLocal='something local'
ssh -T $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您首先需要将命令保存到本地变量并将它们发送到远程服务器。

somethingLocal='something local'
read -r -d '' commands <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC
ssh -T $connectionString "$commands"
Run Code Online (Sandbox Code Playgroud)

但这太乱了...

最终解决方案

制作一个通用函数(注意它可以接受一个字符串或 HEREDOC 作为命令)。

function silentSsh {
    local connectionString="$1"
    local commands="$2"
    if [ -z "$commands" ]; then
        commands=`cat`
    fi
    ssh -T $connectionString "$commands"
}
Run Code Online (Sandbox Code Playgroud)

例子

像这样使用它:

somethingLocal='something local'
silentSsh $connectionString <<EOC
    echo 'blah'
    echo "blah $somethingLocal"
EOC
Run Code Online (Sandbox Code Playgroud)

或者像这样:

silentSsh $connectionString "echo 'blah'"
Run Code Online (Sandbox Code Playgroud)

或者像这样:

silentSsh $connectionString <<'EOC'
    echo 'blah'
    somethingRemote=`echo 'whatever'`
    echo "blah $somethingRemote"
EOC
Run Code Online (Sandbox Code Playgroud)

甚至像这样:

silentSsh $connectionString < getlines.sh
Run Code Online (Sandbox Code Playgroud)

  • 我希望我对此有更多的支持。对于弄清楚我们需要做的一些过度 ssh 脚本非常有帮助。 (2认同)

Kyl*_*ndt 11

这个黑客怎么样?;-P

ssh -t user@machineName '/bin/bash'
Run Code Online (Sandbox Code Playgroud)

以下是正确的:

传递-T给 ssh 以禁用 tty 分配:

ssh -T machineName 'echo foo'
Run Code Online (Sandbox Code Playgroud)

  • ssh user@machine 'your command here' 无论如何都不会显示 motd(它不是交互式 shell)。 (4认同)