¿Cómo gestionar túneles como procesos en segundo plano desde un script de shell?


19

Necesito configurar un par de túneles ssh desde un script de shell. He intentado ejecutarlos como tareas bg usando:

#!/bin/sh
ssh -L 3000:server1:5029 me@server2 &
ssh -L 3001:server3:3306 me@server2 &

pero los túneles no parecen funcionar correctamente cuando los lanzo de esa manera.

Funcionan bien cuando los configuro manualmente en sus propias pestañas, por lo que mi siguiente idea es que el script abra nuevas pestañas en Terminal y ejecute los comandos allí como procesos en primer plano.

Nota: esta pregunta originalmente era "¿Cómo inicio una nueva pestaña de terminal desde el shell y luego ejecuto un comando en ella?", Pero obtuve dos respuestas sobre cómo lidiar con los túneles. Para la pregunta "abrir un shell", encontré esto en SuperUser , que funcionará, aunque las nuevas pestañas en segundo plano serían preferibles a las ventanas de primer plano que se abren.


¿Mantiene una sesión SSH activa en el servidor? Es decir, ¿tiene sus túneles en segundo plano y una sesión SSH en primer plano en la que realmente trabaja?
Jack M.

Hasta ahora, he mantenido tres pestañas abiertas: una para cada túnel, más otra para lo que sea. La mayor parte de mi trabajo real tiene lugar en Eclipse y un navegador.
sprugman

(Los túneles son solamente para que pueda acceder a algunas DBS remotos de mi instancia local Tomcat.)
sprugman

Respuestas:


26

Esto técnicamente no es una respuesta a la pregunta formulada, sino más bien una respuesta a su problema como se describe. El comando ssh tiene dos interruptores que pueden serle útiles:

ssh -f -N -L 3000:server1:5029 me@server2

le dice a ssh que se quede en primer plano el tiempo suficiente para pedir las contraseñas necesarias y luego se ponga en segundo plano, no ejecutando ningún comando remoto sino simplemente manejando el túnel.

Si realmente desea que esto aparezca en una pestaña, puede que desee una solución diferente.


Configuré las claves, por lo que no necesito ingresar contraseñas, pero eso parece funcionar. ¡Gracias! Una pregunta: ¿cómo accedo a los túneles para ver si han caducado, o para finalizarlos, etc.? Ni jobstampoco pslas listas de un mango a ellos ....
sprugman

2
ps -wwajx | grep ssh debería mostrarle los procesos, luego puede eliminarlos como mejor le parezca.
zzz

2
Me gustaría agregar que si omite -fy ejecuta el proceso en segundo plano &al final, puede obtener el PID $!como un controlador para matar el proceso del túnel más adelante en su secuencia de comandos.
bk138

6

Sugeriría simplemente integrar sus túneles en su conexión "uno para lo que sea". Puede facilitarlo agregando las entradas apropiadas a su ~/.ssh/configarchivo:

Host server2
    HostName 10.1.1.1
    User me
    LocalForward 3000 127.0.0.1:5029
    LocalForward 3001 127.0.0.1:3306

Luego puede simplemente iniciar sesión ejecutando:

> ssh server2

Los túneles deberían aparecer y comenzar a funcionar, dejándolo con una única instancia SSH en la que hacer "lo que sea". Sin embargo, si necesita abrir una segunda conexión server2, es posible que reciba un error:

> ssh server2
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000
bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3001
Could not request local forwarding.

Esto no duele más que tus ojos. También puede configurar estos reenvíos para múltiples servidores agregando líneas similares para otros servidores, y todo sucedería de forma automática.


La respuesta de @ zzz parece hacer lo mismo, más o menos, y es un poco más directo. Gracias, sin embargo.
sprugman

Esto, combinado con las opciones -f -N, es una excelente manera de configurar el reenvío para múltiples puertos de una sola vez. Gracias hombre.
narsk
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.