VaTo
VaTo

Reputation: 3078

script to check if I can access multiple servers

I made this script to check if I can connect to a list of many servers:

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

The problem is that if is the first time I’m connecting to the server, the server asks the classic question “The authenticity of host ‘x.x.x.x’ can't be established... bla bla bla” Then I have to respond yes or not and it losses the purpose of making it a script, is there any way to bypass that so I can add it to the script?

Also, There are some servers in which I don't have my keys in them but they have the option to enter a password. In that case it will wait until I try a password to continue with the script execution, so I was wondering if there is a way to improve this script so if the server asks for a password then set it to ERR $SERVER and continue with the script?

Thank you for your help.

Upvotes: 2

Views: 10343

Answers (3)

Maxim Egorushkin
Maxim Egorushkin

Reputation: 136237

If you have quite a few servers what you may want to do is connect to all of them simultaneously. This way it only waits maximum 2 minutes (default TCP connect timeout) if any of the servers is unresponsive.

Connect to each server without allocating a terminal and execute echo . command, redirect the output into a named file. Issue these commands in a loop asynchronously. Then wait till all commands complete, iterate over the log files and check which ones have dots in it. Then report the servers whose log files do not have a dot in it.

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

Upvotes: 1

JNevill
JNevill

Reputation: 50034

You can use the -o flag to set options in 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

Check out the manpage for ssh_config: man ssh_config for all of the options available with the -o flag.

Upvotes: 3

Matt Clark
Matt Clark

Reputation: 28579

Do you actually need to establish an SSH connection?

Or is simply opening a socket connection to the host on the SSH port enough for you to determine that the server is online?

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

Upvotes: 4

Related Questions