2009-09-10 47 views
46

Estoy en el proceso de crear un script bash que se conecta a las máquinas remotas y crea claves privadas y públicas.¿Cómo crear un script bash para verificar la conexión SSH?

Mi problema es que las máquinas remotas no son muy confiables, y no siempre están funcionando. Necesito un script bash que compruebe si la conexión SSH está activa. Antes de crear las claves para uso futuro.

+2

Normalmente, uno ejecuta 'ssh-keygen' para generar un par de claves en el equipo local, luego' ssh-copy-id' para copiar la clave pública en máquinas remotas. Parece que estás haciendo las cosas de manera diferente. ¿Por qué, cuál es tu objetivo? – ephemient

+1

Dado que obviamente está cambiando la forma en que las máquinas remotas establecen conexiones, considere implementar * mosh *. http://mosh.mit.edu/ Está destinado a complementar SSH en conexiones inestables. Tengo muy buenas experiencias con eso. – Aeyoun

Respuesta

92

Esto se puede comprobar con el retorno del valor ssh le da:

$ ssh -q [email protected] exit 
$ echo $? 
255 

$ ssh -q [email protected] exit 
$ echo $? 
0 

EDIT: Otro enfoque sería el uso de Nmap (que no se necesita tener llaves o login-cosas):

$ 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 tendrá que grep el mensaje (nmap no utiliza el valor de retorno para mostrar si un puerto fue filtrado, cerrado o abierto).

Edit2:

Si usted está interesado en el estado actual de la SSH-puerto, se puede sustituir con grep openegrep 'open|closed|filtered':

$ nmap host -PN -p ssh | egrep 'open|closed|filtered' 

sólo para estar completa.

+0

Para completar, ¿puede indicar qué código de retorno significa éxito y qué significa no SSH? –

+0

¿Se pregunta qué pasa si el intento de SSH simplemente se cuelga allí? –

+1

¡Gran respuesta! Sin embargo, no mencionas que el intento de 'ssh' en un host inactivo falla solo después de un tiempo de espera de p. Ej.60 segundos, lo que podría ser prohibitivo para algunos usos. Además, si un nombre de host está definido en '~/.ssh/config', el primer enfoque' ssh' funciona, mientras que el segundo '' nmap' falla con 'Error al resolver '' ' '. – ssc

-2

Creo que está tratando de resolver el problema incorrecto aquí. ¿No deberías tratar de hacer que los daemons 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á (dándole tiempo para encontrar el problema de raíz detrás de que sshd se cierre). ¿O el servicio de red es problemático? Intenta mirar man ifup. ¿A toda la maldita cosa le gusta cerrarte? Bueno, ese es un problema mayor ... intente ver sus registros (comience con syslog) para encontrar fallas de hardware o servicios que cierren su boxen (¿quizás un monitor de temperatura?).

Hacer que sus secuencias de comandos sean tolerantes a fallas es excelente, pero también es posible que desee que su token sea tolerante.

+2

Sam: hay casos de uso válidos para que el script lo verifique. E.g (como yo): tengo una tarea cron ejecutándose en mi máquina para hacer una copia de seguridad de mis datos a través de rsync en mi casa. Ahora estoy fuera o incluso desconectado con bastante frecuencia y necesito reprogramar si la conexión no estaba disponible. Mi boxen funciona bastante bien, pero como dice el refrán: siempre es el cable (también conocido como red) – stwissel

2

Probar:

echo quit | telnet IP 22 2>/dev/null | grep Connected 
+1

Un problema de este enfoque es que no reconoce los hosts definidos en ssh_config (es decir,/etc/ssh/config o ~/.ssh/config) –

16
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 
+1

Salida de una línea: (ssh -q -o "BatchMode = yes" -o "ConnectTimeout = 3" [email protected] "echo 2> & 1" && echo SSH_OK || echo SSH_NOK) | cola -n1 – Xdg

11

se puede usar algo como esto

$(ssh -o BatchMode=yes -o ConnectTimeout=5 [email protected] echo ok 2>&1) 

Esta es la salida "ok" si la conexión ssh está bien

4

Como complemento de la respuesta de @Adrià Cidre se puede hacer:

status=$(ssh -o BatchMode=yes -o ConnectTimeout=5 [email protected] 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 
Cuestiones relacionadas