我需要循环访问多个主机,并在每个主机上运行一系列命令。
就像是:
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等等,但是搞不清楚。
;
jot -w
,这大致相当于linux中的seq -f
提前致谢!
我发现得到正确的引用是相当恼人的。 相反,我倾向于通过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.
如果你经常这样做的话,有各种各样的工具可以让你的生活更轻松:
等等。 我通常只是使用shell脚本,我自己。
我认为pssh是你需要合作的。
http://sourceforge.net/projects/clusterssh/
这是一个明确的赢家:D
看看BatchLogin:
http://batchlogin.sourceforge.net/
BatchLogin是一个免费软件(GPL)许可工具,允许您在不同的环境中以串行格式pipe理与服务器的连接。 它有其局限性,但大多数情况下,无论“区域”(IE:iDMZ,DMZ等)如何复杂,任何脚本或数据文件都可以在多服务器环境中自动传输和执行。 它以这样的方式执行:shell脚本和对服务器的访问可以很容易地在“每个pipe理员”的基础上进行pipe理。