如何在多个主机上使用 ssh 和 xargs 运行 bash 脚本而不将脚本复制到每个主机?

问题描述 投票:0回答:3

如何使用 ssh 和 xargs 在多个主机上运行 bash 脚本,而不将脚本复制到每个主机?

这有效,
ssh host1.com bash -s < ~/httpd-conf/weblogrotate.sh

这行不通,
猫 webserver.hosts | xargs -I % ssh % bash -s < ~/httpd-conf/weblogrotate.sh
tcsh:不明确的输入重定向。

cat webserver.hosts
主机1.com
主机2.com
主机3.com

linux bash shell ssh xargs
3个回答
2
投票

在bash中:

while read host; do
   ssh $host bash -s < ~/httpd-conf/weblogrotate.sh &
done < webserver.hosts

这也会并行运行它们。

我确信您也可以在 tcsh 中执行此操作,但我不熟悉该 shell 的语法。

或者,您也可以使用 GNU 并行而不是 xargs,它可以通过 ssh 远程执行到远程主机。


1
投票

您正在寻找 DSSH。这是一个分布式终端。执行命令一次,它将在所有主机上执行。

使用了主机文件

$ cat hosts
mojito
-l noland kodiak
mojito
kodiak
-C mojito
-i /home/noland/.ssh/id_rsa kodiak

运行命令

$ ./dssh.sh "uptime" < hosts
mojito:O:0:19:16:45 up 3 days, 14 min,  5 users,  load average: 0.22, 0.22, 0.20
kodiak:O:0:13:24:00 up 20:00,  1 user,  load average: 0.42, 0.16, 0.05
mojito:O:0:19:16:45 up 3 days, 14 min,  5 users,  load average: 0.22, 0.22, 0.20
kodiak:O:0:13:24:00 up 20:00,  1 user,  load average: 0.42, 0.16, 0.05
mojito:O:0:19:16:45 up 3 days, 14 min,  5 users,  load average: 0.22, 0.22, 0.20
kodiak:O:0:13:24:00 up 20:00,  1 user,  load average: 0.42, 0.16, 0.0

0
投票

为 ssh 设置别名以避免所有 ssh 相关错误。

alias rssh="ssh -q -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -o BatchMode=yes -o ConnectTimeout=2 -o ServerAliveInterval=60 -o ServerAliveCountMax=3 -o TCPKeepAlive=yes -o LogLevel=ERROR"

使用 ssh 在多个主机上并行执行单个命令:

# cat hosts_inventory.txt | parallel -j 50 --joblog /tmp/log rssh root@{} 'uptime'

使用 ssh 在多个主机上并行执行脚本:

# cat hosts_inventory.txt | parallel -j 50 --joblog /tmp/log rssh root@{} 'bash -s < local_script.sh'

检查无法访问的主机:

awk ' == 255' /tmp/log.txt

注:

  • 在此文件中包含远程主机 IP 或主机名列表

    hosts_inventory.txt

  • 用这个替换你的脚本

    local_script.sh

  • 替换为您的 ssh 用户名而不是

    root

© www.soinside.com 2019 - 2024. All rights reserved.