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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top