如何使用 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
在bash中:
while read host; do
ssh $host bash -s < ~/httpd-conf/weblogrotate.sh &
done < webserver.hosts
这也会并行运行它们。
我确信您也可以在 tcsh 中执行此操作,但我不熟悉该 shell 的语法。
或者,您也可以使用 GNU 并行而不是 xargs,它可以通过 ssh 远程执行到远程主机。
您正在寻找 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
为 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