Mass-Checking SSH Connections using Parallel
Today I wanted to make sure I have SSH access to about 100 servers.
Obviously, I wasn’t going to verify the list by hand, so I put all of
the servers’ names in a file, and wrote this little script:
for NAME in $(cat ~/Desktop/server-names)
do
echo -n "$NAME "
ssh -o "StrictHostKeyChecking no" -o "BatchMode yes" $NAME "echo a" &>/dev/null
if [ $? -eq 0 ]; then
echo "OK"
else
echo "BAD"
fi
done
Note the SSH executes the command echo a, because otherwise it’ll run
interactively. Also, note the options StrictHostKeyChecking no,
meaning it will accept new host fingerprints without asking, and
BatchMode yes, meaning it will not prompt for a password (only try my
SSH key).
This script will print a list of results such as:
server1 OK
server2 BAD
server3 OK
server4 OK
Which you can save in a file, and then view all of the bad servers using something like:
cat ssh-test-results | grep "BAD$" | awk '{print $1}'
Problem was, I didn’t like the script checking only one server at a time, so I parallelized it:
parallel 'echo -n "{} ";ssh -o StrictHostKeyChecking=no -o BatchMode=yes {} "echo a" &>/dev/null;if [ $? -eq 0 ]; then echo "OK";else echo "BAD";fi;' <server-names-file
The result is the same (not sorted according to the original but I didn’t care about it), only much quicker.