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

car*_*tor 2 linux bash mac-osx sudo

我需要循环和 ssh 到多个主机并在每个主机上运行一系列命令。

就像是:

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

但我无法让它正常工作。我在 Google 上看到了各种各样的东西,比如sudo sh -c管道到 sudo 等,但无法弄清楚。

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

提前致谢!

lar*_*sks 6

尝试通过 ssh 传递带引号的命令字符串始终是一个挑战。你没有提到你收到什么样的错误消息,但这里有一些想法:

许多系统上的默认 sudo 配置要求您的会话具有与之关联的有效 TTY。这需要 (a) 使用“-t”选项调用 ssh,或 (b) 从 sudo 配置中删除“requiretty”选项。

这对我有用(目标是一组 RHEL5 系统):

for i in 0 1; do
  ssh -t host$i sudo -i "echo one; echo two; echo 'three four'"
done
Run Code Online (Sandbox Code Playgroud)

这导致:

one
two
three four
Connection to host0 closed.
one
two
three four
Connection to host1 closed.
Run Code Online (Sandbox Code Playgroud)

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

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


Zor*_*che 6

我发现引用正确是很烦人的。相反,我倾向于通过管道将命令传递给远程主机上的 bash。这样您就不必担心在 ssh 命令行中正确进行转义。如果您以交互方式连接,只需将您输入的内容准确地传递到管道中。

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
Run Code Online (Sandbox Code Playgroud)

哪个返回

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)
Run Code Online (Sandbox Code Playgroud)