¿Cómo crear un script bash para verificar la conexión SSH?
-
05-07-2019 - |
Pregunta
Estoy en el proceso de crear un script de bash que se conectaría a las máquinas remotas y crearía claves privadas y públicas.
Mi problema es que las máquinas remotas no son muy confiables y no siempre están activadas. Necesito un script de bash que compruebe si la conexión SSH está activada. Antes de crear las claves para su uso futuro.
Solución
Puede verificar esto con el valor de retorno que ssh le ofrece:
$ ssh -q user@downhost exit
$ echo $?
255
$ ssh -q user@uphost exit
$ echo $?
0
EDITAR: Otro enfoque sería usar nmap (no necesitarás tener claves o cosas para iniciar sesión):
$ a=`nmap uphost -PN -p ssh | grep open`
$ b=`nmap downhost -PN -p ssh | grep open`
$ echo $a
22/tcp open ssh
$ echo $b
(empty string)
Pero deberá grep el mensaje (nmap no usa el valor de retorno para mostrar si un puerto se filtró, cerró o abrió).
EDIT2:
Si está interesado en el estado real del puerto ssh, puede sustituir grep open
con egrep 'abierto | cerrado | filtrado'
:
$ nmap host -PN -p ssh | egrep 'open|closed|filtered'
Solo para completar.
Otros consejos
ssh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK
Puedes usar algo como esto
$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
Esto dará como resultado " ok " si la conexión ssh está bien
Complementando la respuesta de @ Adrià Cidre
puede hacerlo:
status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 user@host echo ok 2>&1)
if [[ $status == ok ]] ; then
echo auth ok, do something
elif [[ $status == "Permission denied"* ]] ; then
echo no_auth
else
echo other_error
fi
Prueba:
echo quit | telnet IP 22 2>/dev/null | grep Connected
En caso de que alguien solo quiera verificar si el puerto 22 está abierto en una máquina remota, este simple comando de netcat es útil. Lo usé porque nmap y telnet no estaban disponibles para mí. Además, la configuración de mi ssh usa autenticación de contraseña de teclado.
Es una variante de la solución propuesta por GUESSWHOz.
nc -q 0 -w 1 "${remote_ip}" 22 < /dev/null &> /dev/null && echo "Port is reachable" || echo "Port is unreachable"
Si desea comprobar que existe una carpeta remota, o cualquier otra prueba de archivos, realmente:
if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
# exists
else
# doesn't exist
fi
No olvide las citas en " $ (ssh ...) "
.
Para conectarse a un servidor con múltiples interfaces
ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.61;[ $? = 1 ] || ssh -o ConnectTimeout=1 -q Necktwi@192.168.1.51
Ejemplo usando script BASH 4+:
# -- ip/host and res which is result of nmap (note must have nmap installed)
ip="192.168.0.1"
res=$(nmap ${ip} -PN -p ssh | grep open)
# -- if result contains open, we can reach ssh else assume failure) --
if [[ "${res}" =~ "open" ]] ;then
echo "It's Open! Let's SSH to it.."
else
echo "The host ${ip} is not accessible!"
fi
Siento que estás tratando de resolver el problema equivocado aquí. ¿No deberías estar tratando de hacer que los demonios ssh sean más estables? Intente ejecutar algo como monit , que verificará si el daemon se está ejecutando y lo reiniciará si no lo está. t (que le da tiempo para encontrar el problema de raíz detrás de sshd apagándose en usted). ¿O es problemático el servicio de red? Intenta mirar man ifup
. ¿A The Damn Thing le gusta apagarte? Bueno, ese es un problema mayor ... intente ver sus registros (comience con syslog) para encontrar fallas de hardware o servicios que están cerrando su caja (¿quizás un monitor de temperatura?).
Hacer que tus secuencias de comandos sean tolerantes a fallas es genial, pero es posible que también desees hacer que tu caja sea tolerante a fallas.