我正在开发一个简单的脚本,它连接到某些计算机并通过ssh
会话执行某些命令:
sshpass -p 'password' ssh $target_ip << EOF
echo \$PATH
# example
echo \$HOSTNAME
[...]
EOF
该操作是正确的,但令我困扰的是,在每个连接上它都会显示ssh
服务器横幅并干扰脚本的其余部分stdout
:
Welcome to Ubuntu 20.04.2 LTS (GNU/Linux 5.4.0-81-generic x86_64)
* Documentation: https://help.ubuntu.com
* Management: https://landscape.canonical.com
* Support: https://ubuntu.com/advantage
System information as of Wed Nov 23 11:58:14 CET 2022
System load: 0.44 Processes: 131
Usage of /: 9.2% of 108.79GB Users logged in: 0
Memory usage: 26% IPv4 address for br0: 172.16.20.11
Swap usage: 0% IPv4 address for br0: 10.130.1.1
Temperature: 36.0 C IPv4 address for tun0: 10.130.0.27
* Strictly confined Kubernetes makes edge and IoT secure. Learn how MicroK8s
just raised the bar for easy, resilient and secure K8s cluster deployment.
https://ubuntu.com/engage/secure-kubernetes-at-the-edge
241 updates can be installed immediately.
134 of these updates are security updates.
To see these additional updates run: apt list --upgradable
The list of available updates is more than a week old.
To check for new updates run: sudo apt update
New release '22.04.1 LTS' available.
Run 'do-release-upgrade' to upgrade to it.
因此,我不希望显示该横幅,只希望显示我在EOF
.
以防万一,我使用的 SSH 版本是OpenSSH_9.1p1, OpenSSL 3.0.7 1 Nov 2022
. 在服务器的情况下,它是OpenSSH_8.2p1 Ubuntu-4ubuntu0.3, OpenSSL 1.1.1f 31 Mar 2020
.
我不想从服务器上删除横幅,这可以在sshd
配置中完成。我想要的是让客户端在脚本中禁用横幅打印。
但是,对其他人有用的 ssh 线路选项(我来过这里和这里)对我不起作用:
ssh -o LogLevel=error $ip
还:
ssh -q $ip
如何在客户端级别禁用此功能?是否没有允许我执行此操作的 ssh 选项或参数?如果没有,我如何才能将其重定向stdout
到/dev/null
而不触及我在内部执行的命令的输出EOF
?
SSH 认证前的一个 banner 来自 SSH 服务器的
Banner
选项sshd_config
。如果不更改服务器的配置,您无法让服务器不向您发送它。您的客户端应该将它打印到 stderr,因此2>/dev/null
会在本地抑制它,但它也会抑制其他消息ssh
(sshpass
在您的情况下)打印到 stderr。SSH 身份验证后的横幅很可能来自远程 shell 的某些启动脚本。*如果
ssh "$target_ip" date
你看到这样的横幅那么你应该检查服务器上的启动脚本,找到负责打印横幅的代码并修复它。如果罪魁祸首在某些全局脚本中(在 中/etc
),创建相应的私有脚本(在您的中$HOME
)可能允许您更改行为。请参阅作为您在服务器上的登录 shell 的 shell 的文档。如果
ssh "$target_ip" date
不显示横幅,这意味着当前相关脚本抑制了非交互式 shell 的横幅。您可以使用此事实使横幅静音,而无需更改服务器上的任何内容。您
sshpass -p 'password' ssh $target_ip << EOF
不会将任何初始命令传递给远程端,因此 SSH 服务器会为您启动一个交互式 shell,该 shell 会读取其标准输入,然后才会使用此处的文档。要启动非交互式 shell,请传递命令。它应该是您要使用的 shell,并且您应该确保它不会以交互方式启动。最好不要依赖远程值
$SHELL
或任何东西,因为你在本地知道你的 here-document 的 shell。不再需要原来的远程 shell,这exec
是个好主意。在下面的示例中,请求的 shell 是
bash
. 它不会以交互方式启动,因为它的标准输入不是 tty(相比之下:导致问题的远程 shell 以交互方式启动,而不考虑 tty,因为 SSH 服务器明确请求它)。* 通常一个人在服务器上的正式默认 shell 可以是任何东西,例如一个包装器
bash
,它无条件地打印一些东西,独立于启动脚本,然后运行bash
。这是一个奇特的场景,但也是可能的。很可能不是这样。