Bash脚本SSH到多个服务器,如果登录失败则继续

时间:2017-05-01 20:32:41

标签: linux bash ssh

我有一个使用SSH密钥登录服务器列表的Bash脚本。

该脚本遍历名为test_hosts.txt的主机名的平面文本文件。

该脚本工作正常,除非其中一个登录由于某种原因失败。如果其中一个主机上的登录失败,则整个脚本将停止,并且列表中的所有其他主机都不会登录。

如果登录因任何原因失败,我如何调整此脚本以继续运行?

#!/bin/bash

USER="username@domain@"

KPATH="/path/to/key"

while read host; do
    echo $host
    echo ${KPATH}    

    GETSIZE="df -h"
    ssh ${USER}$host ${KPATH} "${GETSIZE}" > Test/Hosts/$host.txt

done <Test/Hosts/test_hosts.txt

更新:脚本停止意义,它不会继续到列表中的下一个主机。

2 个答案:

答案 0 :(得分:2)

这是一个猜测,但是ssh倾向于从标准输入中读取,并尝试将它在那里找到的任何内容传递给远程计算机。在ssh循环中使用while read时,这可能意味着ssh会将您想要的数据窃取到循环中的read。如果这是问题,那么有一个相当简单的解决方案:将主机文件传递给fd 3而不是标准输入:

while read -u3 host; do
    ...
done 3<Test/Hosts/test_hosts.txt

3<在fd 3上打开文件而不是stdin,-u3告诉read从fd 3读取。)

另一种可能性是将-n选项添加到ssh,告诉它不要从标准输入读取。

答案 1 :(得分:1)

您可以安装程序clustersshcssh)。它似乎比自定义脚本更适合您的需求。只需在其配置文件中插入您的服务器名称和其他信息。 http://manpages.org/cssh