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)
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.
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)
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
.
Acabei de testar uma solução, não gosto de como ela é feita, mas funciona:
Pré-requisitos:
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
Tags ssh shell-script