bash - remoto - sftp linux ejemplo
¿Cómo crear un script bash para verificar la conexión SSH? (8)
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
Estoy en el proceso de crear un script bash que se conecta a las máquinas remotas y crea claves privadas y públicas.
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.
Puede verificar esto con el valor de retorno 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á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 tendrá que grep el 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 sustituir grep open
con egrep ''open|closed|filtered''
:
$ nmap host -PN -p ssh | egrep ''open|closed|filtered''
Solo para ser completo.
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
Si desea verificar que exista una carpeta remota, o cualquier otra prueba de archivo realmente:
if [ -n "$(ssh "${user}@${server}" [ -d "$folder" ] && echo 1; exit)" ]; then
# exists
else
# doesn''t exist
fi
No olvide las citas en "$(ssh ...)"
.
Siento que tratas de resolver el problema equivocado 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 es así (lo que le dará tiempo a encontrar el problema de raíz detrás de sshd para que se cierre). ¿O el servicio de red es problemático? Intenta mirar al 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 tus scripts sean tolerantes a errores es genial, pero también es posible que desees que tu token sea tolerante.
Solo en caso de que alguien solo desee 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, mi configuración ssh usa la contraseña de teclado auth.
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"
Tratar:
echo quit | telnet IP 22 2>/dev/null | grep Connected
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