Abra o túnel apenas durante a execução do comando local [duplicado]

0

Eu tenho um script que precisa de um túnel para um servidor remoto. Algo parecido com isto:

ssh -fNL 8080:localhost:80 my_server

Como posso fechar o túnel depois que meu script local termina?

O exemplo acima é apenas uma das combinações que tentei. Eu vi como fazer uma chamada ssh de bloqueio, executando um comando remoto e um auto fechamento do túnel com 'sleep', mas eu só quero uma maneira de fornecer o túnel somente durante a execução do meu script.

Minha última abordagem foi forjar o ssh em segundo plano e deixá-lo ser morto quando o script morre, mas com o comando acima o processo ssh ainda está ativo após terminar o script. Também estou explorando como obter o PID para matar manualmente o ssh em segundo plano.

    
por SystematicFrank 05.11.2014 / 16:30

3 respostas

1

Apenas use

function atexit() {
  kill $TUNNEL_PID
}
trap atexit EXIT
ssh -nNL 8080:localhost:80 my_server &
TUNNEL_PID=$!

(ou seja, não diga ao ssh para o segundo plano, apenas execute-o como uma tarefa em segundo plano regular e salve o pid)

    
por 05.11.2014 / 17:14
0

Você deve conseguir usar o comando ssh em segundo plano adicionando & no final. Então, na linha seguinte, adicione

SSHPID=$!

$! é o PID do comando background mais recente, então é o PID da sua sessão SSH. Então, no final do seu script, apenas kill -SIGKILL $SSHPID .

    
por 05.11.2014 / 17:15
0

Acabei de testar uma solução, não gosto de como ela é feita, mas funciona:

Pré-requisitos:

  • comando de tela instalado
  • conexão ssh usando a tecla ssh já desbloqueada

Explicação sobre como criar a solução:

adicione à seguinte linha onde você precisa iniciar o seu túnel:

screen -d -m -S myTunnel ssh 0.0.0.0:123:118.218.118.218:5555 myServer # starts a screen in detached mode and create your tunnel

Execute suas ações e adicione isso ao final do seu script:

kill 'ps -A -o -pid,cmd|grep "SCREEN -d -m -S myTunnel"| grep -v grep| head -n 1| awk '{print $1}'' # kills the opened screen
screen -wipe  # clears screens list (not allways usefull, depends on the commands ran by the screen)

O túnel está desativado.

Esta solução funciona (apenas foi testada), mas esta não é uma resposta de última geração.

Graças a resposta da chepner que sempre uso quando necessário

EDIT: Eu tinha certeza que haveria melhores respostas

    
por 05.11.2014 / 17:35