ssh 到多个主机并使用 sudo 多个命令

ssh 到多个主机并使用 sudo 多个命令

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

就像是:

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

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

  • 我以普通用户身份进行 ssh 操作,无需密码即可使用 sudo(未启用 root 身份 ssh)
  • command1 不返回 0 不应该阻止 command2 运行,等等,因此;
  • 我正在 Mac 上运行循环,因此jot -w,这大致相当于seq -fLinux 中的
  • SSH 到 CentOS 5.4
  • 我希望它以 root 的 $PATH 运行,这样我就不必指定命令的完整路径,但这并不是完全必要的

提前致谢!

答案1

我发现让引用正确是一件非常烦人的事情。相反,我倾向于通过管道将命令传递给远程主机上的 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

返回

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)

答案2

尝试通过 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

其结果是:

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

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

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

答案3

我认为密码就是您需要处理的。

答案4

看一下 BatchLogin:

http://batchlogin.sourceforge.net/

BatchLogin 是一款免费软件 (GPL) 许可工具,可让您跨不同环境以串行格式管理与服务器的连接。它有其局限性,但在大多数情况下,任何脚本或数据文件都可以自动传输并跨多服务器环境执行,无论“区域”的复杂程度如何(即 iDMZ、DMZ 等)。它以一种方式实现这一点,即可以轻松地按“每个管理员”管理 shell 脚本和对服务器的访问。

相关内容