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

script to check if I can access multiple servers

我制作了这个脚本来检查我是否可以连接到许多服务器的列表:

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 并继续脚本?

感谢您的帮助。

您真的需要建立 SSH 连接吗?

或者只是在 SSH 端口上打开到主机的套接字连接足以让您确定服务器在线?

servers.txt

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

port-probe.sh

#!/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

您可以使用 -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_config 的联机帮助页:man ssh_config 了解所有可与 -o 标志一起使用的选项。

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

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

例如:

#/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