一次SSH到多个主机

时间:2014-04-06 15:26:29

标签: ssh

我有一个脚本循环遍历主机列表,使用RSA密钥连接到每个主机,然后将输出保存到本地计算机上的文件 - 这一切都正常。但是,在每台服务器上运行的命令需要一段时间(约30分钟),并且有10台服务器。我想并行运行命令以节省时间,但似乎无法使其正常工作。这是现在(工作)的代码:

for host in $HOSTS; do
    echo "Connecting to $host"..
    ssh -n -t -t $USER@$host "/data/reports/formatted_report.sh"
done

如何加快速度?

4 个答案:

答案 0 :(得分:5)

您应该将&添加到ssh调用的末尾,它将在后台运行。

for host in $HOSTS; do
    echo "Connecting to $host"..
    ssh -n -t -t $USER@$host "/data/reports/formatted_report.sh" &
done

答案 1 :(得分:3)

我尝试使用&将SSH命令发送到后台,但我放弃了这一点,因为在完成SSH命令后,脚本会对输出文件执行更多命令,这些命令需要创建。

使用&使脚本直接跳转到那些命令,这些命令失败,因为输出文件还没有。但后来我了解了 wait 命令,该命令在继续之前等待后台命令完成。现在这是我的代码:

for host in $HOSTS; do
    echo "Connecting to $host"..
    ssh -n -t -t $USER@$host "/data/reports/formatted_report.sh" &
done
wait

答案 2 :(得分:0)

尝试massh http://m.a.tt/er/massh/。这是一个在多个主机上运行ssh的好工具。

答案 3 :(得分:0)

Hypertable项目最近添加了一个多主机ssh工具。此工具使用libssh构建并建立连接并发出命令异步并行以实现最大并行性。有关完整文档,请参阅Multi-Host SSH Tool。要在一组主机上运行命令,您可以按如下方式运行它:

$ ht ssh host00,host01,host02 /data/reports/formatted_report.sh

您还可以指定主机名或IP模式,例如:

$ ht ssh 192.168.17.[1-99] /data/reports/formatted_report.sh
$ ht ssh host[00-99] /data/reports/formatted_report.sh

它还支持--random-start-delay <millis>选项,该选项将在每个主机上以0到<millis>毫秒之间的随机时间间隔延迟命令的启动。当正在运行的命令访问中央资源时,此选项可用于避免雷鸣般的群体问题。