Script to Verify Passwordless SSH Access
If you have passwordless SSH configured on multiple servers, it’s a good idea to verify your access from time to time. This task may get rather tedious with a large number of remote systems. The simple script below will cycle through a list of servers and make sure you can access them without being prompted for a password. Any failures will be saved in the CSV file for later analysis.
#!/bin/bash
# |
# ___/"___
# __________/ o __________
# (I) (G) ___/ (O) (R)
# 2013-09-19
# ----------------------------------------------------------------------------
# Verify passwordless access to servers in the list (see $infile variable)
# The list must contain one server name per line
# ----------------------------------------------------------------------------
#
infile=""
spinner()
{
local pid=$1
local delay=0.25
local spinstr='|/-'
while [ "$(ps a | awk '{print $1}' | grep $pid)" ]; do
local temp=${spinstr#?}
printf " [%c] " "$spinstr"
local spinstr=$temp${spinstr%"$temp"}
sleep $delay
printf "bbbbbb"
done
printf " bbbb"
}
configure() {
timestamp=$(date +'%Y-%m-%d %H:%M:%S')
if [ -z "${infile}" ]
then
infile="/tmp/unix_master_list.txt"
fi
if [ ! -r "${infile}" ]
then
echo "Server list ${infile} not found. Exiting..."
exit 1
fi
outfile=${HOME}/server_list_checker.csv
if [ -f "${outfile}" ]
then
/bin/rm -f "${outfile}"
echo "Date,Hostname,Error" >> "${outfile}"
fi
ssh_command="/usr/bin/ssh -qt -o PubkeyAuthentication=yes -o PasswordAuthentication=no -o StrictHostKeyChecking=no -o ConnectTimeout=10 -o NumberOfPasswordPrompts=0"
server_total=$(wc -l "${infile}" | awk '{print $1}')
}
check_access() {
i=1
for host in `cat "${infile}" | egrep -v "-vip|-ilo"`
do
status_ping=1 ; status_ssh=1
status_ping=$(/bin/ping -q -c 2 -i 1 -W 1 -w 2 ${host} > /dev/null 2>&1 ; echo $?)
if [ ${status_ping} -eq 0 ]
then
status_ssh=$(${ssh_command} username@${host} "uptime" > /dev/null 2>&1 ; echo $?)
if [ ${status_ssh} -ne 0 ]
then
echo "${timestamp},${host},ssh failure" | tee -a "${outfile}"
fi
else
echo "${timestamp},${host},ping failure" | tee -a "${outfile}"
fi
clear
cat << EOF
Failures so far:
----------------------------------------------
`cat "${outfile}"`
----------------------------------------------
Checking host ${i} of ${server_total}: ${host}
EOF
(( i = i + 1 ))
done
}
# RUNTIME
configure
check_access & spinner $!

