ssh到多个主机和sudo多个命令

我需要循环访问多个主机,并在每个主机上运行一系列命令。

就像是:

for i in $(jot -w '%02.0f' 14 1) >do ssh user@host$i sudo -i "command1; command2; command3" >done 

但我不能让它正常工作。 我在谷歌上看到过很多东西,例如sudo sh -c ,pipe道连接到sudo等等,但是搞不清楚。

  • 我ssh'ing作为一个普通用户可以sudo没有密码(ssh作为根未启用)
  • command1不返回0不应该阻止command2运行等,因此;
  • 我正在从一个mac运行循环,因此jot -w ,这大致相当于linux中的seq -f
  • ssh'ing到CentOS 5.4
  • 我希望它以root的$ PATH运行,所以我不必指定命令的完整path,但这不是完全必要的

提前致谢!

我发现得到正确的引用是相当恼人的。 相反,我倾向于通过pipe道而不是通过pipe道将命令传递给远程主机。 这样你就不用担心在你的ssh命令行里逃脱了。 只要通过交互连接就可以正确inputpipe道中的内容。

 CMDS="sudo bash -c '/usr/bin/id; /usr/bin/id; '/usr/bin/id" for i in 0 1; do echo $CMDS | ssh -t host$i bash done 

哪个返回

 uid=0(root) gid=0(root) groups=0(root) uid=0(root) gid=0(root) groups=0(root) uid=0(root) gid=0(root) groups=0(root) 

尝试通过ssh传递引用的命令string始终是一个挑战。 你没有提到你得到的是什么types的错误信息,但是这里有一些想法:

许多系统上的默认sudoconfiguration要求您的会话有一个有效的TTY与它关联。 这需要(a)用“-t”选项调用ssh,或者(b)从sudoconfiguration中删除“requiretty”选项。

这适用于我(目标是一组RHEL5系统):

 for i in 0 1; do ssh -t host$i sudo -i "echo one; echo two; echo 'three four'" done 

这导致:

 one two three four Connection to host0 closed. one two three four Connection to host1 closed. 

如果你经常这样做的话,有各种各样的工具可以让你的生活更轻松:

  • ClusterSSH: http : //sourceforge.net/apps/mediawiki/clusterssh/index.php? title = Main_Page
  • pssh: http : //code.google.com/p/parallel-ssh/
  • dsh: http : //www.netfort.gr.jp/~dancer/software/dsh.html.en

等等。 我通常只是使用shell脚本,我自己。

我认为pssh是你需要合作的。

http://sourceforge.net/projects/clusterssh/

这是一个明确的赢家:D

看看BatchLogin:

http://batchlogin.sourceforge.net/

BatchLogin是一个免费软件(GPL)许可工具,允许您在不同的环境中以串行格式pipe理与服务器的连接。 它有其局限性,但大多数情况下,无论“区域”(IE:iDMZ,DMZ等)如何复杂,任何脚本或数据文件都可以在多服务器环境中自动传输和执行。 它以这样的方式执行:shell脚本和对服务器的访问可以很容易地在“每个pipe理员”的基础上进行pipe理。