Estoy en el proceso de crear un script bash que iniciaría sesión en las máquinas remotas y crearía claves públicas y privadas.
Mi problema es que las máquinas remotas no son muy confiables y no siempre funcionan. Necesito un script bash que verifique si la conexión SSH está activa. Antes de crear las claves para uso futuro.
bash
ssh
connection
chutsu
fuente
fuente
ssh-keygen
para generar un par de claves en la máquina local y luegossh-copy-id
para copiar la clave pública en las máquinas remotas. Parece que estás haciendo las cosas de manera diferente. ¿Por qué, cuál es tu objetivo?Respuestas:
Puede verificar esto con el valor de retorno que ssh le brinda:
$ ssh -q user@downhost exit $ echo $? 255 $ ssh -q user@uphost exit $ echo $? 0
EDITAR: Otro enfoque sería usar nmap (no necesitará tener claves o cosas de inicio de 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 tendrá que grep del mensaje (nmap no usa el valor de retorno para mostrar si un puerto fue filtrado, cerrado o abierto).
EDIT2:
Si está interesado en el estado real del puerto ssh, puede sustituirlo
grep open
poregrep 'open|closed|filtered'
:$ nmap host -PN -p ssh | egrep 'open|closed|filtered'
Solo para estar completo.
fuente
ssh
ingresar a un host inactivo falla solo después de un tiempo de espera de, por ejemplo, 60 segundos, lo que puede ser prohibitivo para algunos usos. Además, si se define un nombre de host~/.ssh/config
, el primerssh
enfoque funciona mientras que el segundonmap
fallaFailed to resolve "<hostname>"
.$?
? etcssh -q user@downhost exit | echo $?
tubería de conexión en el resultado de ecossh -q -o "BatchMode=yes" -i /home/sicmapp/.ssh/id_rsa <ID>@<Servername>.<domain> "echo 2>&1" && echo $host SSH_OK || echo $host SSH_NOK
fuente
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
fuente
Complementando la respuesta de
@Adrià Cidre
puedes hacer: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
fuente
Tratar:
echo quit | telnet IP 22 2>/dev/null | grep Connected
fuente
El siguiente
ssh
comando debe tener un código de salida de0
una conexión exitosa y un valor distinto de cero en caso contrario.ssh -q -o BatchMode=yes [email protected] exit if [ $? != "0" ]; then echo "Connection failed" fi
fuente
En caso de que alguien solo desee verificar si el puerto 22 está abierto en una máquina remota, este simple comando netcat es útil. Lo usé porque nmap y telnet no estaban disponibles para mí. Además, mi configuración de 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"
fuente
Si desea verificar que existe una carpeta remota, o cualquier otro archivo de prueba realmente:
if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then # exists else # doesn't exist fi
No olvide las comillas en
"$(ssh ...)"
.fuente
Para conectarse a un servidor con múltiples interfaces
fuente
Ejemplo de uso del 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
fuente
https://onpyth.blogspot.com/2019/08/check-ping-connectivity-to-multiple-host.html
El enlace anterior es para crear un script de Python para verificar la conectividad. Puede utilizar un método similar y utilizar:
ping -w 1 -c 1 "IP Address"
Comando para crear script bash.
fuente
Siento que estás tratando de resolver el problema equivocado aquí. ¿No deberías intentar hacer que los demonios ssh sean más estables? Intente ejecutar algo como monit , que verificará si el demonio se está ejecutando y lo reiniciará si no lo está (dándole tiempo para encontrar la raíz del problema detrás de sshd que se apaga). ¿O el servicio de red es problemático? Intente mirar
man ifup
. ¿A Whole Damn Thing le gusta cerrarse contigo? Bueno, ese es un problema mayor ... intente mirar sus registros (comience con syslog) para encontrar fallas de hardware o servicios que están apagando su boxen (¿tal vez un monitor de temperatura?).Hacer que sus scripts sean tolerantes a fallas es excelente, pero es posible que también desee que su boxen sea tolerante a fallas.
fuente