Vamos supor que você esteja usando o seguinte comando para estabelecer sua conexão SSH (prefiro usar o arquivo .ssh/config
que simplificará o comando ssh, mas isso não é obrigatório):
ssh user@host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa
- as opções
-fTN
irão empurrar a conexão para o segundo plano - escrevi essa parte principal, porque esse conjunto de opções é crítico para minha sugestão abaixo; - a opção
-R 2222:127.0.0.1:22
criará o túnel reverso; - a opção
-i $HOME/.ssh/id_rsa
indica o arquivo de identidade.
Podemos usar ps -aux | grep "<our command>" | sed '$ d'
para verificar se a conexão está estabelecida ou não. Com base nisso, nosso script poderia ser:
#!/bin/bash
SSH_COMMAND="ssh user@host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa"
if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]]
then exec $SSH_COMMAND
fi
Chame esse script my_autossh
, coloque-o em ~/bin
e torne-o executável. Em seguida, execute crontab -e
e adicione o seguinte trabalho:
* * * * * $HOME/bin/my_autossh
Se você não quiser usar o Cron, modifique o script my_autossh
desta maneira:
#!/bin/bash
SSH_COMMAND="ssh user@host -fTN -R 2222:127.0.0.1:22 -i $HOME/.ssh/id_rsa"
while true; do
if [[ -z $(ps -aux | grep "$SSH_COMMAND" | sed '$ d') ]]
then eval $SSH_COMMAND
else sleep 60
fi
done
E use nohup
para colocá-lo em segundo plano:
nohup my_autossh >/dev/null 2>&1 &