代码之家  ›  专栏  ›  技术社区  ›  VaTo

用于检查是否可以访问多个服务器的脚本

  •  1
  • VaTo  · 技术社区  · 7 年前

    我编写此脚本是为了检查是否可以连接到多个服务器的列表:

    for SERVER in $(cat servers.txt); do
    ssh root@$SERVER && echo OK $SERVER || echo ERR $SERVER
    done
    

    问题是,如果是我第一次连接到服务器,服务器会问一个典型的问题 The authenticity of host ‘x.x.x.x’ can't be established... bla bla bla 然后我必须回答是或不是,这就失去了制作脚本的目的,有没有办法绕过它,这样我就可以将它添加到脚本中?

    此外,有些服务器中我没有密钥,但它们可以选择输入密码。在这种情况下,它将等到我尝试输入密码后才能继续执行脚本,因此我想知道是否有办法改进此脚本,以便如果服务器要求输入密码,则将其设置为ERR$server并继续执行脚本?

    谢谢你的帮助。

    3 回复  |  直到 7 年前
        1
  •  3
  •   Matt Clark    7 年前

    您确实需要建立SSH连接吗?

    或者只需在SSH端口上打开与主机的套接字连接,就足以确定服务器是否联机?

    服务器。txt文件

    hostA.example.com
    hostB.example.com
    hostC.example.com
    

    端口探头。上海

    #!/bin/bash
    
    PORT=22
    TIMEOUT=3
    for SERVER in $(cat servers.txt); do
    
        # Open a socket and send a char
        echo "-" | nc -w $TIMEOUT $SERVER $PORT &> /dev/null
    
        # Check exit code of NC
        if [ $? -eq 0 ]; then
    
            echo "$SERVER is Available."
        else
    
            echo "$SERVER is Unavailable."
        fi
    done
    
        2
  •  3
  •   JNevill    7 年前

    可以使用-o标志在SSH中设置选项:

    for SERVER in $(cat servers.txt); do
      ssh -o StrictHostKeyChecking=no -o BatchMode=yes root@$SERVER exit && echo OK $SERVER || echo ERR $SERVER
    done
    

    查看ssh\u配置的手册页: man ssh_config 对于使用-o标志的所有可用选项。

        3
  •  1
  •   Maxim Egorushkin    7 年前

    如果您有相当多的服务器,那么您可能需要同时连接到所有服务器。这样,它最多只等待2分钟(默认TCP connect 超时)如果任何服务器没有响应。

    连接到每个服务器而不分配终端并执行 echo . 命令,将输出重定向到命名文件中。在循环中异步发出这些命令。然后 wait 在所有命令完成之前,遍历日志文件并检查哪些文件中有点。然后报告日志文件中没有点的服务器。

    E、 g.:

    #/bin/bash
    
    servers="$@"
    
    for server in $servers; do
        ssh -o StrictHostKeyChecking=no -o PasswordAuthentication=no -Tn $server echo . >$server.log 2>$server.error.log &
    done
    wait # After 2 minutes all connection attempts timeout.
    for server in $servers; do
        [[ -s $server.log ]] || echo "Failed to connect to $server" >2
    done