Como parar / matar um túnel de autossh?


17

Agora que 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 está clara nesta parte.

A maneira mais fácil parece ser reiniciar a máquina? Isso está correto?

Respostas:


21

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

A razão é

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

isso autosshé simplesmente um script de shell, não um serviço . Ele inicia um novo programa, em sua última linha,

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

novamente não é um serviço. Quanto a exec(você pode checá-lo duas vezes no wiki dos hackers Bash ), é um comando embutido no shell que substitui o shell atual pelo seguinte comando ( /usr/lib/autossh/autossh "$@"neste caso) sem iniciar um novo processo. Então, a única maneira de parar autosshé matar o script de chamada, por exemplo

pkill -3 autossh

(obrigado a dviljoen por apontar a importância do uso da bandeira -3 , veja abaixo). Aliás, matar a sshconexão não funcionará, porque o comando de chamada ( ou seja , o acima) simplesmente iniciará uma nova conexão assim que perceber que a antiga foi descartada.


1
Na verdade, você deve matar autossh sem o -9. Se uma conexão já tiver sido feita através do túnel, será gerado um processo filho sshd para lidar com isso. Matar o autossh principal com -9 deixará o processo sshd para trás. O túnel ainda funcionará até o tempo limite do processo sshd. Se você usar o sinal padrão (-3) no kill, ele será desligado normalmente e levará o processo sshd gerado.
dviljoen

oi como a -3 é o sinal de matar padrão, você realmente não precisa passar explicitamente -3, você pode omiti-lo
Andrés Alcarraz

@ AndrésAlcarraz Você realmente certeza sobre isso? SIGTERMé o padrão, e esse é 15. SIGQUITé 3, consulte superuser.com/questions/352147/what-does-kill-3-mean e en.wikipedia.org/wiki/Kill_(command) - Além disso, FWIW, verifiquei e -15não o encerrei , então SIGTERMnão pode ser usado.
Daniel F

E usar pkillsem sinal (= the default) também não termina autossh.
Daniel F

@DanielF você está certo, eu estava confuso y o "sinal padrão (-3)" do comentário dvijoen
Andrés Alcarraz

5

execute o auto ssh com:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

mate com:

kill pid

BTW

pkill -9 autossh está errado

-9garante que o processo não saia normalmente, portanto, o sshprocesso ainda estará lá quando o autosshprocesso for morto

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

maneira correta é definir AUTOSSH_PIDFILEenv var então killsó pid


Bem-vindo ao superusuário. Parece que o parágrafo final é a sua resposta real, enquanto o restante da sua pergunta é um comentário em outra resposta . Dada a natureza das perguntas e respostas deste site, seria útil adicionar detalhes suficientes à sua resposta para que ela possa se sustentar por si mesma. Obrigado por contribuir e não se esqueça de conferir o tour .
Eu digo Restabelecer Monica

4

Procure o processo:

ps aux | grep ssh

A coluna secon é o número PID

Kill process by PID :)

kill -9 PIDnumber

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


1

Eu sei que isso foi respondido, mas, ao contrário dos comentários acima, o uso pkill -3 autosshNÃO mata os processos filho sshd para mim.

Eu uso essa função no meu .bashrcarquivo.
Basicamente, é como adicionar um --killargumento à reprodução automática.

  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 sshe which autosshverificar os caminhos no seu sistema.

Desde que o primeiro argumento não seja --kill, ele apenas passa os argumentos para a reprodução automática.

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

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

autossh --kill dbserver1mata apenas as conexões com o dbserver1
autossh --kill dbservermata o dbserver1, o dbserver2, etc.
autossh --kill dbservermata todas as conexões autossh

Para esclarecer, ele deve matar apenas as sessões SSH iniciadas pelo autossh.

Se você executar ps aux | grep sshenquanto tiver sessões autossh e ssh em execução, verá que as iniciadas pelo autossh usam o caminho completo (/ usr / bin / ssh e / usr / lib / autossh / autossh).
Este script corresponde apenas aos resultados aos processos iniciados com o caminho específico. Fiz isso porque eu (e presumo que a maioria das pessoas) geralmente digita sshe não o caminho completo, o que evita que eu mate minhas sessões ssh normais.

Espero que isso ajude os outros.


alguma razão específica para, em $(which autossh)vez de simplesmente autossh?
MestreLion
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.