Parece que você quer a opção -N
para ssh.
-N Do not execute a remote command. This is useful for just forwarding ports
(protocol version 2 only).
Pergunta relacionada: iniciar a conexão ssh do servidor para o cliente
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 adicionou ao /etc/crontab
. Mas eu descobri que funciona se eu só executá-lo "à mão" do shell, mas se ele é chamado pelo cron, o ssh se conecta e imediatamente termina. (assim, o script acima reconecta o tempo todo)
De man ssh
, descobri que para conexões de segundo plano eu deveria chamá-lo com -n
key, mas isso não ajudava. Então, eu apenas procurei por scripts similares e descobri que funciona se eu chamar tail -f something
, ou seja, algum comando "neverending", então eu acabei de criar o arquivo /tmp/dummy_file
e agora meu comando ssh tem esta aparência:
ssh -o ServerAliveInterval=240 -R 2225:localhost:22 -n user@host tail -f /tmp/dummy_file
Funciona agora! Mas, esta solução parece um pouco feia, mais eu não entendo realmente as razões reais desse comportamento. Por acaso, tentei chamar bash
em vez de tail -f
( bash
parece-me o comando "neverending"), mas não funciona.
Então, alguém poderia, por favor, explicar este comportamento, e qual é a maneira correta de criar uma conexão ssh em background para manter o ssh invertido?
Sugiro 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, você pode fazer uma pesquisa na web por autossh upstart
para 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 em todos os momentos para determinados serviços.
Vou dar uma segunda sugestão de @ 0xC0000022L e usar autossh
também. Eu o uso para manter uma conexão SSH do meu laptop enquanto eu o levo de um lugar para outro e isso simplesmente funciona. Eu uso essa conexão para fazer o tunelamento das portas 25 e 2143 para acessar meus servidores SMTP e IMAP pessoais.
Aqui está o script que eu uso:
$ more /home/saml/bin/autossh_mail.sh
#!/bin/bash
autossh -M 0 -f -N -L 2025:localhost:25 -L 2143:localhost:143 sam@imap-o
Eu, então, mantenho uma entrada Host
no meu arquivo $HOME/.ssh/config
para o host imap-o
.
$ more $HOME/.ssh/config
ServerAliveInterval 15
ForwardX11 yes
ForwardAgent yes
ForwardX11Trusted yes
GatewayPorts yes
Host *
ControlMaster auto
ControlPath ~/.ssh/master-%r@%h:%p
IdentityFile ~/.ssh/id_dsa
Host imap-o
User sam
ProxyCommand ssh [email protected] nc 'echo %h|sed 's/-o//'' %p
O script autossh_mail.sh
é executado como parte da minha área de trabalho quando eu faço login. Você pode acessá-lo via gnome-session-properties
.
Tags ssh background-process