SSH和redirect

考虑下面的命令:

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的NOPASSWDfunction,请参阅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