2010-01-04 37 views
25

He escrito un small bash script que necesita un túnel SSH para extraer los datos desde un servidor remoto, por lo que pide al usuario:ssh: comprobar si un túnel está vivo

echo "Please open an ssh tunnel using 'ssh -L 6000:localhost:5432 example.com'" 

me gustaría comprobar si el usuario había abierto este túnel y sale con un mensaje de error si no hay ningún túnel. ¿Hay alguna forma de consultar el túnel ssh, es decir, verificar si el puerto local 6000 está realmente en túnel hacia ese servidor?

Gracias,

Adam

+0

esto podría ayudar parcialmente "lsof -i | grep ssh" – qartal

Respuesta

26

Esta es mi prueba. Espero que sea útil.

# $COMMAND is the command used to create the reverse ssh tunnel 
COMMAND="ssh -p $SSH_PORT -q -N -R $REMOTE_HOST:$REMOTE_HTTP_PORT:localhost:80 [email protected]$REMOTE_HOST" 

# Is the tunnel up? Perform two tests: 

# 1. Check for relevant process ($COMMAND) 
pgrep -f -x "$COMMAND" > /dev/null 2>&1 || $COMMAND 

# 2. Test tunnel by looking at "netstat" output on $REMOTE_HOST 
ssh -p $SSH_PORT [email protected]$REMOTE_HOST netstat -an | egrep "tcp.*:$REMOTE_HTTP_PORT.*LISTEN" \ 
    > /dev/null 2>&1 
if [ $? -ne 0 ] ; then 
    pkill -f -x "$COMMAND" 
    $COMMAND 
fi 
+0

Parece que hay un error en el código anterior. si [$? -ne 0], el 0 probablemente sea un 1. el egrep remoto establecerá $? a 0 si encuentra una coincidencia con éxito. En cualquier caso, necesitaba usar 1 para obtener este comando y dejar de matar el túnel existente cada vez que ejecutaba el comando. – user2495504

7

Esto es realmente más de una pregunta de tipo serverfault, pero se puede usar netstat.

algo como:

# netstat -lpnt | grep 6000 | grep ssh 

Esto le dirá si hay un proceso ssh escuchando en el puerto especificado. también le informará el PID del proceso.

Si realmente quiere volver a verificar que el proceso ssh se inició con las opciones correctas, a continuación, puede mirar hacia arriba el proceso por el PID en algo así como

# ps aux | grep PID 
+2

Tenga en cuenta que este la solución no funciona en OS X, porque netstat en OS X es diferente. – hlin117

5

Use autossh. Es la herramienta que está destinada a monitorear la conexión ssh.

16

autossh es la mejor opción - proceso de verificación no funciona en todos los casos (por ejemplo zombi proceso, relacionados con la red problemas)

ejemplo:

autossh -M 2323 -c arcfour -f -N -L 8088:localhost:80 host2 
25

Netcat es su amigo:

nc -z localhost 6000 || echo 'no tunnel open'; exit 1 
+0

Guau, eso es muy útil.Estoy haciendo un script que antes que nada crea un túnel ssh, y ahora estoy usando netcat para saber cuándo está listo para aceptar conexiones. Funciona de maravilla. – Hubro

0
#!/bin/bash 

# Check do we have tunnel to example.com server 
lsof -i [email protected]:6000 > /dev/null 

# If exit code wasn't 0 then tunnel doesn't exist. 
if [ $? -eq 1 ] 
then 
    echo ' > You missing ssh tunnel. Creating one..' 
    ssh -L 6000:localhost:5432 example.com 
fi 

echo ' > DO YOUR STUFF < ' 
0

Estos son los pasos más detallados para probar o solucionar problemas de un túnel SSH. Puede usar algunos de ellos en un script. Estoy agregando esta respuesta porque tuve que solucionar el vínculo entre dos aplicaciones después de que dejaron de funcionar. Simplemente desgranar para el proceso de ssh no fue suficiente, ya que todavía estaba allí. Y no pude usar nc -z porque esa opción no estaba disponible en mi conjuro de netcat.

Comencemos desde el principio. Supongamos que hay una máquina, que se llamará local con dirección IP 10.0.0.1 y otra, llamada remota, en 10.0.3.12. Precederé estos nombres de host, a los comandos a continuación, por lo que es obvio dónde se ejecutan.

El objetivo es crear un túnel que reenvíe el tráfico TCP desde la dirección de bucle invertido en la máquina remota en el puerto 123 a la máquina local en el puerto 456.Esto se puede hacer con el siguiente comando, en la máquina local:

local:~# ssh -N -R 123:127.0.0.1:456 10.0.3.12 

Para comprobar que el proceso está en marcha, lo que podemos hacer:

local:~# ps aux | grep ssh 

Si ve el comando en la salida, nos puede proceder. De lo contrario, verifique que la clave SSH esté instalada en el control remoto. Tenga en cuenta que excluyendo el nombre de usuario antes de la IP remota, hace que ssh use el nombre de usuario actual.

A continuación, se quiere comprobar que el túnel está abierta en el control remoto:

remote:~# netstat | grep 10.0.0.1 

Debemos obtener una salida similar a la siguiente:

tcp 0 0 10.0.3.12:ssh 10.0.0.1:45988 ESTABLISHED 

sería bueno en realidad ver algunos datos que van desde el control remoto hasta el host. Aquí es donde entra netcat. En CentOS se puede instalar con yum install nc.

En primer lugar, abrir un puerto de escucha en la máquina local:

local:~# nc -l 127.0.0.1:456 

después establecer una conexión en el control remoto:

remote:~# nc 127.0.0.1 123 

Si abre un segundo terminal de la máquina local, puede ver la conexión Algo como esto:

local:~# netstat | grep 456 
tcp 0 0 localhost.localdom:456 localhost.localdo:33826 ESTABLISHED 
tcp 0 0 localhost.localdo:33826 localhost.localdom:456 ESTABLISHED 

Mejor aún, seguir adelante y escribir algo en el control remoto:

remote:~# nc 127.0.0.1 8888 
Hallo? 
anyone there? 

Visita obligatoria que se refleja en el terminal local:

local:~# nc -l 127.0.0.1:456 
Hallo? 
anyone there? 

El túnel ¡está trabajando! Pero, ¿qué sucede si tiene una aplicación, llamada , nombre de aplicación, que se supone que escucha en el puerto 456 de la máquina local? Termina nc en ambos lados y luego ejecuta tu aplicación. Puede comprobar que se está escuchando en el puerto correcta con this:

local:~# netstat -tulpn | grep LISTEN | grep appname 
tcp 0 0 127.0.0.1:456 0.0.0.0:* LISTEN 2964/appname 

Por cierto, que ejecuta el mismo comando en el mando a distancia debe mostrar sshd escucha en el puerto 127.0.0.1:123.

0

Podemos comprobar con el comando ps

# ps -aux | grep ssh 

Mostrará todo el servicio shh correr y podemos encontrar el túnel de servicio aparece

Cuestiones relacionadas