2011-07-20 23 views
6

Soy un usuario principiante de Linux, y también bastante novato en ssh y túneles.Cómo configurar un inicio (re) automático de un túnel ssh en segundo plano

De todos modos, mi objetivo es mantener abierto un túnel ssh en el fondo.

Para hacer eso, escribí el siguiente lote que luego agregué en crontab (el lote se procesa automáticamente cada 5 minutos durante los días de trabajo y de 8am a 9pm). He leído en otro hilo en stackoverflow que uno debe usar autossh que asegurará que el ssh siempre estará bien a través de una comprobación recurrente. Así lo hice yo ....

#!/bin/bash 
LOGFILE="/root/Tunnel/logBatchRestart.log" 
NOW="$(date +%d/%m/%Y' - '%H:%M)" # date & time of log 

if ! ps ax | grep ssh | grep tunnelToto &> /dev/null 
then 
    echo "[$NOW] ssh tunnel not running : restarting it" >> $LOGFILE 
    autossh -f -N -L pppp:tunnelToto:nnnnn [email protected] -p qqqq 
    if ! ps ax | grep ssh | grep toto &> /dev/null 
    then 
      echo "[$NOW] failed starting tunnel" >> $LOGFILE 
    else 
      echo "[$NOW] restart successfull" >> $LOGFILE 
    fi 
fi 

Mi problema es que a veces el túnel deja de funcionar, aunque cada cosa que se ve bien (ps ax | grep ssh> muestra el resultado de las dos tareas que se esperan: autossh tarea principal y el ssh túnel en sí). De hecho, sé sobre el problema porque el túnel es utilizado por un software de terceros que desencadena un error tan pronto como el túnel deja de responder.

SO Me pregunto cómo debería mejorar mi lote en orden. Será capaz de verificar el túnel y reiniciarlo si está muerto. Vi algunas ideas en there, pero se concluyó con la pista "autossh" ... que ya uso. Por lo tanto, me he quedado sin ideas ... ¡Si alguno de ustedes tiene, con mucho gusto los echaré un vistazo!

Gracias por interesarse en mi pregunta, y para sus (tal vez) sugerencias!

+0

creo que deberías echar un vistazo a serverfault.com. Buscar 'ssh' o' autossh' Ejemplo: http://serverfault.com/questions/159766/bash-script-with-permanent-ssh-connection – powerMicha

Respuesta

12

En lugar de verificar el proceso ssh con ps que puede hacer el siguiente truco

crear un script, que hace lo siguiente y añadirlo a su crontab través crontab -e

#!/bin/sh 

REMOTEUSER=username 
REMOTEHOST=remotehost 

SSH_REMOTEPORT=22 
SSH_LOCALPORT=10022 

TUNNEL_REMOTEPORT=8080 
TUNNEL_LOCALPORT=8080 

createTunnel() { 
    /usr/bin/ssh -f -N -L$SSH_LOCALPORT:$REMOTEHOST:SSH_REMOTEPORT -L$TUNNEL_LOCALPORT:$REMOTEHOST:TUNNEL_REMOTEPORT [email protected]$REMOTEHOST 
    if [[ $? -eq 0 ]]; then 
     echo Tunnel to $REMOTEHOST created successfully 
    else 
     echo An error occurred creating a tunnel to $REMOTEHOST RC was $? 
    fi 
} 

## Run the 'ls' command remotely. If it returns non-zero, then create a new connection 
/usr/bin/ssh -p $SSH_LOCALPORT [email protected] ls >/dev/null 2>&1 
if [[ $? -ne 0 ]]; then 
    echo Creating new tunnel connection 
    createTunnel 
fi 

De hecho, este script abrir dos puertos

  • puerto 22 que se usarán para verificar si el túnel sigue vivo
  • puerto 8080 que es el puerto es posible que desee utilizar

Por favor marque y me envíen más preguntas por los comentarios

+0

Hola y gracias por esto. – Marvin

+0

Hola Marvin, si mi respuesta te ayudó a resolver el problema, vota y acepta esta respuesta: esto aumentará tu reputación y la de ti en stackoverflow. – powerMicha

+0

Intenté pero encontré algunos problemas: * Estoy confundido acerca de los puertos; ¿No debería el puerto remoto ser el mismo, cualquiera que sea el local? * también sobre el puerto: Tengo esta opción '-p $ SOME_PORT' en el comando ssh que solía usar; ¿esto anula el $ REMOTE_PORT o es este algún puerto adicional, y evitó mencionarlo a propósito? Eventualmente, obtengo esto a cambio del lote (fijo): ssh: No se pudo resolver el nombre de host [MyHostName]: Nombre o servicio desconocido. el nombre de host es correcto, pero parece que no fue capaz de hacer el detector de túnel en el puerto 22): ¿Hay alguna falla? – Marvin

0

(añado esto como una respuesta ya que no hay suficiente espacio para que la ONU una comentario)

Ok, he conseguido hacer funcionar por lotes para iniciar el túnel SSH (tuve que especificar mi nombre de host en lugar de localhost con el fin de que podría ser activado):

#!/bin/bash 

LOGFILE="/root/Tunnel/logBatchRedemarrage.log" 
NOW="$(date +%d/%m/%Y' - '%H:%M)" # date et heure du log 


REMOTEUSER=username 
REMOTEHOST=remoteHost 

SSH_REMOTEPORT=22 
SSH_LOCALPORT=10022 

TUNNEL_REMOTEPORT=12081 
TUNNEL_SPECIFIC_REMOTE_PORT=22223 
TUNNEL_LOCALPORT=8082 

createTunnel() { 
    /usr/bin/ssh -f -N -L$SSH_LOCALPORT:$REMOTEHOST:$SSH_REMOTEPORT -L$TUNNEL_LOCALPORT:$REMOTEHOST:$TUNNEL_REMOTEPORT [email protected] -p $TUNNEL_SPECIFIC_REMOTE_PORT 
    if [[ $? -eq 0 ]]; then 
     echo [$NOW] Tunnel to $REMOTEHOST created successfully >> $LOGFILE 
    else 
     echo [$NOW] An error occurred creating a tunnel to $REMOTEHOST RC was $? >> $LOGFILE 
    fi 
    } 

## Run the 'ls' command remotely. If it returns non-zero, then create a new connection 
/usr/bin/ssh -p $SSH_LOCALPORT [email protected] ls >/dev/null 2>&1 
if [[ $? -ne 0 ]]; then 
    echo [$NOW] Creating new tunnel connection >> $LOGFILE 
    createTunnel 
fi 

Sin embargo, recibí un mensaje inmediato (a continuación) cuando el túnel se está ejecutando y cuando cron intenta lanzar nuevamente el lote ... parece que no puede escucharlo. Además, dado que necesito algo de tiempo para obtener una prueba, aún no puedo decir que se reiniciará con éxito si el túnel está apagado.

Aquí está la respuesta al segundo inicio del lote.

aprieto: Dirección ya en uso channel_setup_fwd_listener: no se puede escuchar al puerto: 10022 aprieto: Dirección ya en uso channel_setup_fwd_listener: no puede escuchar el puerto: 8082 No se pudo solicitud de reenvío local.

+0

el mensaje de dirección en uso que obtienes es porque eliminaste de tu script la parte que verifica si tu túnel ya se está ejecutando. 'pgrep -fl $ SSH_LOCALPORT: $ REMOTEHOST: $ SSH_REMOTEPORT' revelaría que el ssh de la primera ejecución aún se está ejecutando. – Superole

-1

Puede usar netcat para probar la conexión y abrirlo si es necesario:

while sleep 3; do nc -z localhost 3333 >/dev/null || ssh -NfL 3333:lg:5432 [email protected]; done 
Cuestiones relacionadas