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

时间:2018-03-29 20:13:51

标签: bash ssh scripting openssh

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

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 个答案:

答案 0 :(得分:2)

您可以使用-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标志可用的所有选项。

答案 1 :(得分:1)

您确实需要建立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

答案 2 :(得分:1)

如果您有很多服务器,您可能想要同时连接所有服务器。这样,如果任何服务器没有响应,它只等待最多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