【问题标题】:How to check connection to a list of servers in bash?如何检查与bash中服务器列表的连接?
【发布时间】:2019-06-04 00:34:41
【问题描述】:

我正在尝试检查服务器列表的连接。我想遍历列表,检查连接是否有效,如果是,做一些事情,如果不是,回显问题消息。

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

这些变量包含在配置文件中:
$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

【问题讨论】:

    标签: bash for-loop ssh


    【解决方案1】:

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

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

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

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

    执行以下命令:

    ssh-keygen -t rsa
    

    然后

    ssh-copy-id -i root@ip_address
    

    现在你可以联系了

    ssh <user>@<host>
    

    Furher information

    【讨论】:

    • 实际上,我尝试访问的所有主机都已经在我的“已知主机列表”中。身份验证始终通过密钥完成,因此不需要密码。只是为了测试我的脚本,我在列表中放了一个无效的 ip。该服务器实际上并不存在。但可能是我的一个有效服务器 IP 无法访问或类似的情况。因此,如果无法建立连接,我希望 ssh 会引发错误。
    【解决方案2】:

    您可以添加-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"
    

    【讨论】:

    • @xMaNuu,请再次查看我对$?的建议
    • 抱歉,我将代码更改为 if [[ "$retcode" -ne 0 ]]。请参阅上面我编辑的代码。但无论如何,这不起作用。如果无法访问第一个节点,则完整的脚本将停止。我希望脚本迭代到我列表中的下一个节点。
    • 我认为这不会有帮助。在我的情况下,没有主机密钥检查,因为机器无法访问。这是我尝试连接的假IP。但正是在这种情况下,我想为这个特定的 ip 得到一个错误,然后继续我列表中的下一个 ip。
    • @xMaNuu,有超时。所以你可以运行脚本并等待
    猜你喜欢
    • 1970-01-01
    • 2010-09-26
    • 2017-12-16
    • 1970-01-01
    • 2016-06-18
    • 2021-03-17
    • 2013-09-04
    • 2012-10-05
    • 2014-07-11
    相关资源
    最近更新 更多