Verifica o processo de um único túnel SSH em um script de shell?

0

Em um sistema de laboratório remoto, eu tenho um script de shell que inicia um túnel SSH reverso para minha caixa de salto principal que é executada com uma tarefa cron a cada 5 minutos. Se o túnel SSH estiver ativo, nada acontece, se estiver em baixo, inicia-o.

#!/bin/bash
createTunnel() {
/usr/bin/ssh -N -R :2222:localhost:22 [email protected]
if [[ $? -eq 0 ]]; then
 echo Tunnel to jumpbox created successfully
else
 echo An error occurred creating a tunnel to jumpbox. RC was $?
fi
}
/bin/pidof ssh
if [[ $? -ne 0 ]]; then
  echo Creating new tunnel connection
  createTunnel
fi

Isso tem sido extremamente confiável para garantir meu acesso à máquina remota se ela for reinicializada ou quando meu IP de jumpbox for alterado. No entanto, recentemente adicionei um segundo túnel SSH a este sistema e tive uma situação em que um dos dois túneis caiu e nunca foi restabelecido. Parece que desde que houve um túnel, a saída pidof ainda retornava com um PID, então o script nunca rodou "createTunnel". Como eu tenho dois túneis SSH, a saída pidof mostra os dois PIDs:

$ /bin/pidof ssh
28281 28247

Como posso ajustar meu script para determinar se apenas um dos túneis está inativo?

    
por Andrew Plas 02.01.2018 / 06:47

1 resposta

2

Meus pensamentos:

  1. arquivos Pid. Eu acho que esta é uma abordagem geral.
  2. Problema XY , use autossh .

(Algumas outras respostas podem elaborar essas idéias.)

  1. Existem dois scripts, certo? (não exatamente em conformidade com DRY ). Dê-lhes nomes diferentes. Seu script espera que seu ssh saia. A instância adicional, em vez de verificar pid (s) de ssh , deve verificar pid (s) de seu próprio nome. Exatamente um pid dois pids significam que nenhum script anterior ainda está sendo executado:

    [ $(pidof -x scriptname | wc -w) -eq 2 ] && createTunnel
    

    Por que dois? Porque $() inicia um subshell que também conta. Bastante sujo, tudo bem.

  2. Um pouco fora da caixa, eu acho. Crie dois links simbólicos com nomes exclusivos, como:

    ln -s /usr/bin/ssh ssh-foo
    ln -s /usr/bin/ssh ssh-bar
    

    Deixe o primeiro script executar ssh-foo , deixe a segunda execução ssh-bar . Suas invocações pidof devem segmentar ssh-foo ou ssh-bar respectivamente. Desta forma eles não se misturam. Como bônus, ssh adicional (possivelmente executado por um motivo completamente diferente no futuro) não os afetará.

E finalmente:

  1. Você não precisa verificar nada.

    /usr/bin/ssh -o ExitOnForwardFailure=yes -N -R :2222:localhost:22 [email protected]
    

    Se o túnel já existir, o encaminhamento de porta falhará com certeza e ssh será encerrado. Eu acho que você pode executar essa linha diretamente de um crontab, nenhum script é necessário.

por 02.01.2018 / 08:37

Tags