考虑下面的命令:
ssh aristotle sudo /bin/sh < test.sh
我希望redirect应用到/bin/sh
但它被sudo使用。 任何想法如何实现我想要的?
为什么不复制test.sh然后调用呢?
scp test.sh aristotle:/tmp/test.$$.sh ssh aristotle sudo /bin/sh /tmp/test.$$.sh ssh aristotle rm /tmp/test.$$.sh
$$是本地机器上进程的PID,给出一定程度的随机性,所以你的文件不会被破坏。
redirect与ssh和sudo一起工作! 它只干扰从ssh和/或sudo的任何密码对话框。
所以,你不要使用redirect,而是像例如复制脚本到目标机器然后执行它(例如@edoloughlin build议 )的解决方法。
或者你configurationssh和sudo不提示input密码。 那么它就像一个魅力:
$ echo "hostname" | ssh -A orwell sudo /bin/sh orwell
有数以千计的howtos解释如何使用SSH无密码,所以我不解释这一部分。 至于sudo,有几种方法可以使用它无密码。 @jtimberman build议允许用户在一般的密码sudo(通过sudo的NOPASSWD
function,请参阅sudoers(5) )。
我个人使用PAM模块pam-ssh-agent 。 它允许sudo对转发的ssh代理进行身份validation,并且只有在没有ssh代理可用的情况下才会回到基于密码的身份validation。 在Debian和Ubuntu上
apt-get install pam-ssh-agent-auth
然后按照pam_ssh_agent_auth(8)中的说明进行configuration。
试试这个方法:
ssh aristotle sudo /bin/sh -c "/bin/sh \\< test.sh"
houdini@www ~ % sudo "echo foo >> ~houdini/foo.$$" sudo: echo foo >> ~houdini/foo.30055: command not found houdini@www ~ % ls ~houdini/foo* zsh: no matches found: ~houdini/foo* houdini@www ~ % sudo -s "echo foo >> ~houdini/foo.$$" houdini@www ~ % ls ~houdini/foo* -rw------- 1 root root 4 Jul 8 20:16 /home/houdini/foo.30055 houdini@www ~ % sudo -i "echo foo >> ~houdini/foo.$$" houdini@www ~ % ls ~houdini/foo* -rw------- 1 root root 8 Jul 8 20:17 /home/houdini/foo.30055
我用ssh somehost sudo cat \< /etc/passwd
取得了一些成功; 尝试像这样:
ssh aristotle sudo /bin/sh \< test.sh
很可能,sudo提示input密码,并试图从你的test.sh脚本中获取密码。
有两个解决scheme。
首先,您可以为目标系统上的userid分配NOPASSWD。
your_username ALL=(ALL) NOPASSWD: ALL
或者第二,你可以SSH系统,并提供一个密码sudo,然后再次运行它
$ 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
当然,你需要注意你的密码出现在你的shell历史logging中(比如把它放在一个只有你有权访问的文件中,然后通过cat或者类似的方式从那个文件中获得值)。
我非常喜欢前者,只使用基于SSH密钥的身份validation,根本没有密码,以及驻留在一个系统上的私钥:我的笔记本电脑(使用16+字符密码保护)。
我的test.sh的内容:
#!/bin/sh hostname -f