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?
fonte
&
no final do seu comando ssh:ssh -o ServerAliveInterval=240 -R 2225:localhost:22 user@host &
while
loop será executado repetidamente, iniciando uma novassh
conexão em segundo plano a cada 5 segundos, certo? Não é disso que eu preciso.Respostas:
Parece que você deseja a
-N
opção ssh.fonte
Eu sugiro fortemente que você considere
autossh
. Ele possui certas heurísticas que permitirão determinar se a perda de conexão é o motivo subjacente e diminuirá a frequência de tentativas de reconexão. Além disso, monitora a conexão usando túneis extras, o que a torna altamente útil para cenários como o que você está perguntando.Se você estiver no Ubuntu, por exemplo, poderá fazer uma pesquisa na web para
autossh upstart
encontrar alguns exemplos úteis sobre como configurar o Ubuntu para que o túnel seja mantido de forma persistente.Estou usando isso para manter uma conexão em túnel aberta para o meu servidor o tempo todo para determinados serviços.
fonte
autossh
, tentei , li este artigo: goo.gl/jVuuSR , mas só funcionou para mim se eu tiver conexão com a Internet imediatamente na inicialização do sistema; mas se a conexão for estabelecida posteriormente, não funcionou. Não tenho certeza, talvez eu tenha feito algo errado, mas mesmo neste artigo o autor tem osleep 10
dele/etc/rc.local
, para garantir que a conexão à Internet já esteja pronta quando o autossh for chamado.upstart
e outras substituições init, você pode vincular a inicialização do túnel a um ou mais dispositivos de rede ativos. A melhor das soluções (IMO) da Web é a seguinte: erik.torgesta.com/tag/ssh-upstart ... e nãosleep 10
, de qualquer maneira , não ajudará nada em alguns casos extremos.ssh-upstart
, vou dar uma olhada!Vou usar a sugestão do @ 0xC0000022L
autossh
também. Eu o uso para manter uma conexão SSH do meu laptop quando a levo de um lugar para outro e ele simplesmente funciona. Eu uso essa conexão para encapsular as portas traseiras 25 e 2143 para acessar meus servidores SMTP e IMAP pessoais.Aqui está o script que eu uso:
Eu mantenho uma
Host
entrada no meu$HOME/.ssh/config
arquivo para hostimap-o
.O
autossh_mail.sh
script é executado como parte da minha área de trabalho quando eu entro. Você pode acessá-lo viagnome-session-properties
.fonte