我已经设置了 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)
我不得不稍微玩弄这些命令,但这应该会让你开始。
tow*_*owo 19
如果您希望在每个用户的基础上进行此操作,只需执行一个操作,即可touch ~/.hushlogin使用 OpenSSH 进行设置。
更新:正如其他地方所指出的,pam_motd可能被配置为不使用每个用户.hushlogin;检查/etc/login.defs的HUSHLOGIN_FILE。它可以配置为列出所有用户/etc/hushlogins或类似的。
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)
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)
| 归档时间: |
|
| 查看次数: |
90613 次 |
| 最近记录: |