Criando um script .sh para verificar se a conexão SSH existe e, se não, conecte-se

2

Estou com dificuldades para escrever o que suponho ser um roteiro fácil.

Basicamente eu tenho um computador no trabalho, que está oculto atrás de um NAT para o qual eu não tenho acesso. Eu preciso de SSH para este computador, então a única maneira de fazer isso é definir um redirecionamento de porta reversa, onde este computador NATted irá se conectar ao meu servidor em casa, enquanto redireciona uma porta para si mesmo e então eu simplesmente posso ssh nele através do meu servidor de casa.

O script .sh será executado pelo computador no trabalho a cada 5 minutos e é isso que eu gostaria que ele fizesse:

Verifique se existe uma conexão ssh ativa para o meu servidor e, em caso afirmativo, simplesmente não faça nada e saia do script.

Se não houver conexão ativa detectada, conecte-se executando "ssh [email protected] -i key.priv" e saia do script.

Se a tentativa de conexão ssh for interrompida por algum motivo, por mais de 2 minutos, force a saída do script (não tenho certeza se isso é possível, se não, então não precisa estar lá)

Obrigado gentilmente por seu conselho.

    
por Askerman 26.04.2018 / 11:25

1 resposta

2

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 &
    
por pa4080 26.04.2018 / 13:14