Pregunta relacionada: iniciar la conexión ssh del servidor al cliente
La respuesta desde allí me ayudó mucho, este comando hace lo que necesito:
ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP
Entonces escribí el guión para volver a conectar todo el tiempo:
#!/bin/bash
while true; do
echo "try to connect..."
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host
echo "restarting in 5 seconds.."
sleep 5
done
Y lo agregó a la /etc/crontab
. Pero descubrí que funciona si solo lo ejecuto "a mano" desde shell, pero si lo llama cron, ssh se conecta e inmediatamente termina. (Entonces, el script anterior se vuelve a conectar todo el tiempo)
De man ssh
, descubrí que para las conexiones en segundo plano debería llamarlo con -n
clave, pero no ayudó. Luego, solo busqué scripts similares y descubrí que funciona si llamo tail -f something
, es decir, un comando "interminable", así que acabo de crear un archivo vacío /tmp/dummy_file
y ahora mi comando ssh se ve así:
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file
¡Ahora funciona! Pero, esta solución parece un poco fea, además, realmente no entiendo las razones reales de ese comportamiento. Por casualidad, intenté llamar en bash
lugar de tail -f
(también bash
me parece un comando "interminable"), pero no funciona.
Entonces, ¿alguien podría explicar este comportamiento, y cuál es la forma correcta de crear una conexión ssh en segundo plano para mantener el túnel ssh inverso?
while
ciclo se ejecutará una y otra vez, comenzando una nueva ssh
conexión de fondo cada 5 segundos, ¿verdad? Esto no es lo que necesito.
&
al final de su comando ssh:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &