Como parar / matar um túnel autossh?

14

Agora que eu tenho um túnel de autossh, qual é a maneira correta de pará-lo?

Parece não haver uma maneira fácil de fazer isso. A documentação não é clara nesta parte.

O caminho mais fácil parece ser o de reiniciar a máquina? Está correto?

    
por onknows 02.12.2015 / 11:03

4 respostas

14

Não, a maneira correta de matar autossh é simplesmente matar o processo autossh , nada mais.

O motivo é

# file $(which autossh)
/usr/bin/autossh: POSIX shell script, ASCII text executable

esse autossh é simplesmente um script de shell, não um serviço . Começa um novo programa, na sua última linha,

exec /usr/lib/autossh/autossh "$@"

novamente, não é um serviço. Quanto a exec (você pode verificar isso no wiki dos hackers Bash ), é um comando construído em shell que substitui o shell atual pelo seguinte comando ( /usr/lib/autossh/autossh "$@" neste caso) sem iniciar um novo processo. Portanto, a maneira somente de parar autossh é matar o script de chamada, por exemplo

pkill -3 autossh

(obrigado a dviljoen por apontar a importância de usar a sinalização -3 , veja abaixo). Incidentalmente, matar a conexão ssh não funcionará, porque o comando de chamada ( isto é, , o acima) simplesmente iniciará uma nova conexão assim que perceber que a antiga foi descartada.

    
por 02.12.2015 / 12:05
4

Pesquise pelo processo:

ps aux | grep ssh

A coluna secon é o número PID

Matar processo por PID :)

kill -9 PIDnumber

Use sudo se você não tem privilégios de root.

    
por 02.12.2015 / 11:13
3

execute o ssh automático com:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

mate-o com:

kill pid

BTW

pkill -9 autossh é errado

-9 certifica-se de que o processo não está a sair normalmente, por isso ssh process ainda está lá quando o processo autossh é eliminado

sem -9 ainda é ruim, se você tiver vários túneis em execução, pkill irá matar todos eles

A maneira correta é definir AUTOSSH_PIDFILE env var e kill somente pid

    
por 15.12.2017 / 17:25
0

Eu sei que isso foi respondido, mas ao contrário dos comentários acima, usar pkill -3 autossh NÃO mata os processos filhos do sshd para mim.

Eu uso essa função no meu arquivo .bashrc .
Basicamente, é como adicionar um argumento --kill para autossh.

  if [ "$1" = "--kill" ]; then
    ps aux | 
    grep -P "(/usr/bin/ssh|/usr/lib/autossh/autossh)\s.*$2" |
    awk '{print $2}' |
    xargs -r kill
  else
    $(which autossh) "$@"
    echo "" # prevents line wrapping when you kill the ssh process
  fi

Você pode executar which ssh e which autossh para verificar os caminhos em seu sistema.

Contanto que o primeiro argumento não seja --kill , ele apenas passa os argumentos ao autossh.

Este script elimina o autossh & instâncias de ssh. Isso é importante se você estiver usando o encaminhamento de porta, porque, se matar APENAS a instância autossh não mata o túnel, ele apenas impede que ele se reconecte se / quando finalmente desconectar.

Você também pode especificar um termo de pesquisa (nome do host) para matar apenas túneis específicos.

autossh --kill dbserver1 mata apenas as conexões para dbserver1
autossh --kill dbserver mata dbserver1, dbserver2, etc.
autossh --kill dbserver mata ALL conexões autossh

Para esclarecer, DEVE matar apenas as sessões do SSH iniciadas pelo autossh.

Se você executar ps aux | grep ssh enquanto tiver sessões autossh e ssh em execução, você verá que as iniciadas pelo autossh usam o caminho completo (/ usr / bin / ssh e / usr / lib / autossh / autossh).
Esse script só corresponde resultados a processos iniciados com o caminho especificado. Eu fiz isso porque eu (e eu suponho que a maioria das pessoas) geralmente digita ssh e não o caminho completo, o que o impede de matar minhas sessões ssh normais.

Espero que isso ajude os outros.

    
por 19.06.2018 / 23:07

Tags