如何检查与bash中服务器列表的连接?

时间:2019-01-09 09:18:51

标签: bash for-loop ssh

我正在尝试检查服务器列表的连接。我想遍历列表,检查连接是否正常,如果可以,请执行一些操作,否则请回显问题消息。

我的问题是:
该脚本将在第一个节点处停止而不回显$?。 那么,我的for循环怎么了?

这些var包含在配置文件中:
$nodes是服务器IP的列表,例如1.1.1.1,2.2.2.2,10.10.10.10
$user是一个字符串

for node in $(echo $nodes | sed "s/,/ /g")
    do
    echo "Checking Node: $node"

    ssh -q -o ConnectTimeout=3 $user@$node echo ok
    echo $?
    if [[ $? != 0 ]]
    then
        echo "Problem in logging into $node"
    else
        # do some stuff here
    fi
done

编辑#1:

for node in $(echo $nodes | sed "s/,/ /g")
    do
    echo "Checking Node: $node"

    ssh -q -t -o ConnectTimeout=3 $user@$node "echo ok"
    retcode=$?
    echo $retcode
    if [[ "$retcode" -ne 0 ]]
    then
        echo "Problem in logging into $node"
    else
        echo "OK"
    fi
done

2 个答案:

答案 0 :(得分:0)

您可以添加-t来创建虚拟终端,并在命令中添加引号:

ssh -q -t -o ConnectTimeout=3 ${user}@${node} "echo ok"

也使用-ne代替用于比较字符串的!=

if [[ "$?" -ne 0 ]]

echo $?弄乱了返回码。您应该使用类似以下内容的

ssh -q -t -o ConnectTimeout=3 ${user}@${node} "echo ok"
retcode=$?
echo $retcode
if [[ "$retcode" -ne 0 ]]

您可以像这样重写ssh命令,以避免ssh主机密钥出现问题

ssh -q -t -o StrictHostKeyChecking=no -o ConnectTimeout=3 ${user}@${node} "echo ok"

答案 1 :(得分:0)

这是因为ssh首先要求您验证主机的权限,如果您接受该权限,它将要求输入密码。这就是为什么您的命令不返回外壳程序并等待输入的原因。

如果您的目的只是验证ssh连接,那么您可以考虑使用

telnet <your_host> <port> < /dev/null

但是,如果要运行某些命令,则需要主机之间的信任关系。在这种情况下,您可以使用:

执行以下命令:

ssh-keygen -t rsa

然后

ssh-copy-id -i root@ip_address

现在您可以连接

ssh <user>@<host>

Furher information