我正在尝试在远程服务器上执行多个命令。我遇到的问题是运行sudo
命令后,ssh 连接会自动关闭。
失败的主要测试:
ssh -i "/path/to/key/id_rsa" user@server << EOF
sudo ls -la "/etc/redhat-release"
cat "/etc/redhat-release"
EOF
仅返回ls
结果
-rw-r--r-- 1 root root 55 Jan 29 2013 /etc/redhat-release
而如果我将两个命令放在同一行上,即
ssh -i "/path/to/key/id_rsa" user@server << EOF
sudo ls -la "/etc/redhat-release"; cat "/etc/redhat-release"
EOF
我将得到两个命令的结果
-rw-r--r-- 1 root root 55 Jan 29 2013 /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)
现在是最奇怪的部分:
主测试在具有相同配置的其他服务器上工作。有一组服务器可以工作,而其他服务器集则不起作用。
如果我从测试中删除
sudo
,我将从两个命令中获得结果,因此这不是ssh
限制
例如
ssh -i "/path/to/key/id_rsa" user@server << EOF
ls -la "/etc/redhat-release"
cat "/etc/redhat-release"
EOF
-rw-r--r-- 1 root root 55 Jan 29 2013 /etc/redhat-release
Red Hat Enterprise Linux Server release 6.4 (Santiago)
附加信息:
这两个命令在
sudoers
文件中都有NOPASSWD
标志,因此不会询问密码。requiretty
被注释掉了。SSH版本:
OpenSSH_5.3p1, OpenSSL 1.0.0-fips 29 Mar 2010
SELinux 被禁用
ssh -vvv
选项不会显示工作服务器和非工作服务器之间的日志有任何显着差异
工作服务器和非工作服务器之间的
sshd_config
相同
我在这里假设服务器集之间必须存在一些配置差异,因为它们彼此一致,但我无法弄清楚是什么。
一种可能的解决方法:
ssh -i "/path/to/key/id_rsa" user@server sudo bash << EOF
ls -la "/etc/redhat-release"
cat "/etc/redhat-release"
EOF
检查您的sudo
版本 (sudo -V
)。
事实证明,一台服务器正在运行Sudo version 1.8.6p3
而另一台服务器在Sudo version 1.8.21p2
上运行,并且正在运行sudo 1.8.20中修复的错误:
修复了 sudo 如果未连接到 tty 也会消耗 stdin 的问题,即使 sudos 中未启用 log_input。错误 #786。
更新sudo
版本解决了此问题。