$ echo "your_password" | ssh remote_host sudo -l
your_username@remote_host's password:
[sudo] password for your_username:
User your_username may run the following commands on this host:
(ALL) ALL
$ ssh remote_host sudo /bin/bash < test.sh
remote_host.example.com
为什么不直接复制 test.sh 然后调用它呢?
$$ 是本地计算机上进程的 PID,提供一定程度的随机性,因此您的文件不会被破坏。
重定向正在使用 ssh 和 sudo!它只会干扰来自 ssh 和/或 sudo 的任何密码对话框。
因此,您不使用重定向,而是使用解决方法,例如首先将脚本复制到目标机器然后执行它(例如@edoloughlin建议的)。
或者您将 ssh 和 sudo 配置为不提示输入密码。然后它就像一个魅力:
有成千上万的howtos解释如何使用ssh无密码,所以我不解释那部分。至于 sudo,有几种方法可以无密码地使用它。@jtimberman建议一般允许有问题的用户无密码 sudo(通过 sudo 的
NOPASSWD
功能,请参阅sudoers(5))。我个人使用 PAM 模块pam-ssh-agent。它允许 sudo 针对转发的 ssh 代理进行身份验证,并且只有在没有 ssh 代理可用时才回退到基于密码的身份验证。仅在 Debian 和 Ubuntu 上
然后按照pam_ssh_agent_auth(8)中的说明进行配置。
试试这个方法:
我使用
ssh somehost sudo cat \< /etc/passwd
了一些成功;尝试类似:ssh aristotle sudo /bin/sh \< test.sh
很可能,sudo 正在提示输入密码并试图从您的 test.sh 脚本中获取密码。
有两种解决方案。
首先,您可以在目标系统上为您的用户 ID 分配 NOPASSWD。
或者第二个,你可以 ssh 到系统并为 sudo 提供密码,然后再次运行它并
当然,您需要对出现在 shell 历史记录中的密码采取预防措施(例如将其放入只有您有权访问的文件中,然后通过 cat 或类似方法从该文件中获取值)。
我非常喜欢前者,仅使用基于 SSH 密钥的身份验证,根本没有密码,并且私钥位于一个系统上:我的笔记本电脑(受 16 个以上字符的密码保护)。
我的 test.sh 的内容: