Pergunta relacionada: iniciar conexão ssh do servidor para o cliente
A resposta de lá me ajudou muito, esse comando faz o que eu preciso:
ssh -R 2225:localhost:22 loginOfServerWithPublicIP@publicIP
Então, eu escrevi o script para reconectar o tempo todo:
#!/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
E acrescentou ao /etc/crontab
. Mas descobri que funciona se eu apenas o executar "manualmente" a partir do shell, mas se for chamado pelo cron, o ssh se conectará e terminará imediatamente. (assim, o script acima se reconecta o tempo todo)
De man ssh
, descobri que para conexões em segundo plano eu deveria chamá-lo com -n
chave, mas não ajudou. Então, procurei por scripts semelhantes e descobri que funcionaria se eu chamar tail -f something
, ou seja, algum comando "sem fim", então criei um arquivo vazio /tmp/dummy_file
e agora meu comando ssh se parece com o seguinte:
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file
Funciona agora! Mas, essa solução parece um pouco feia, e eu realmente não entendo as razões reais desse comportamento. Por acaso, tentei ligar em bash
vez de tail -f
( bash
parece-me também um comando "sem fim"), mas não funciona.
Então, alguém poderia explicar esse comportamento e qual é a maneira correta de criar uma conexão ssh em segundo plano para manter o túnel ssh reverso ativo?
while
loop será executado repetidamente, iniciando uma nova ssh
conexão em segundo plano a cada 5 segundos, certo? Não é disso que eu preciso.
&
no final do seu comando ssh:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &