Come fermare / uccidere un tunnel di autossh?


17

Ora che ho un tunnel di autossh, qual è il modo corretto per fermarlo?

Non sembra esserci un modo semplice per farlo. La documentazione non è chiara su questa parte.

Il modo più semplice sembra essere riavviare la macchina? È corretto?

Risposte:


21

No, il modo corretto di uccidere autosshè semplicemente quello di uccidere il processo autossh, nient'altro.

Il motivo è

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

questo autosshè semplicemente uno script di shell, non un servizio . Avvia un nuovo programma, nella sua ultima riga,

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

di nuovo non è un servizio. Per quanto riguarda exec(puoi ricontrollarlo nel wiki degli hacker di Bash ), è un comando incorporato nella shell che sostituisce la shell corrente con il seguente comando ( /usr/lib/autossh/autossh "$@"in questo caso) senza avviare un nuovo processo. Quindi, l' unico modo per fermare autosshè uccidere lo script chiamante, per esempio

pkill -3 autossh

(grazie a dviljoen per aver sottolineato l'importanza di usare il flag -3 , vedi sotto). Per inciso, l'uccisione della sshconnessione non funzionerà, perché il comando di chiamata ( cioè quello sopra) avvierà semplicemente una nuova connessione non appena si rende conto che la vecchia è stata abbandonata.


1
In realtà dovresti uccidere autossh senza il -9. Se è già stata stabilita una connessione attraverso il tunnel, verrà generato un processo sshd figlio per gestirlo. Uccidere l'autossh genitore con -9 lascerà indietro il processo sshd. Il tunnel continuerà a funzionare fino al timeout del processo sshd. Se usi il segnale predefinito (-3) su kill, questo si spegnerà con grazia e porterà con sé il processo sshd generato.
dviljoen,

ciao come -3 è il segnale di kill predefinito, in realtà non è necessario passare esplicitamente -3, puoi ometterlo
Andrés Alcarraz

@ AndrésAlcarraz Ne sei davvero sicuro? SIGTERMè l'impostazione predefinita e quella lo è 15. SIGQUITè 3, vedi superuser.com/questions/352147/what-does-kill-3-mean e en.wikipedia.org/wiki/Kill_(command) - Inoltre, FWIW, ho appena controllato e -15non lo spengo, quindi SIGTERMnon può essere usato.
Daniel F,

E anche l'uso pkillsenza segnale (= the default) non termina autossh.
Daniel F,

@DanielF hai ragione, ero confuso dal "segnale predefinito (-3)" dal commento dvijoen
Andrés Alcarraz,

5

esegui auto ssh con:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

uccidilo con:

kill pid

BTW

pkill -9 autossh è un torto

-9si assicura che il processo non esca con garbo, quindi il sshprocesso è ancora presente quando il autosshprocesso viene ucciso

senza -9è ancora male, se hai più tunnel in esecuzione, pkillli uccideranno tutti

il modo corretto è impostare AUTOSSH_PIDFILEenv var quindi killsolo quel pid


Benvenuto in Super User. Sembra che il tuo ultimo paragrafo sia la tua vera risposta, mentre il resto della tua domanda è un commento su un'altra risposta . Data la natura di domande e risposte di questo sito, sarebbe utile aggiungere dettagli sufficienti alla tua risposta in modo che possa resistere da sola. Grazie per il tuo contributo e non dimenticare di dare un'occhiata al tour .
Dico Reinstate Monica il

4

Cerca il processo:

ps aux | grep ssh

La colonna di secondo è il numero PID

Termina processo tramite PID :)

uccidi -9 PIDnumber

Usa sudo se non hai i privilegi di root.


1

So che è stata data una risposta, ma contrariamente ai commenti sopra, l'uso di pkill -3 autosshNON uccide i processi figlio sshd per me.

Uso questa funzione nel mio .bashrcfile.
Bascialmente, è come aggiungere un --killargomento all'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

È possibile eseguire which sshe which autosshverificare i percorsi sul proprio sistema.

Fintanto che il primo argomento non lo è --kill, passa gli argomenti all'autossh.

Questo script uccide le istanze di autossh e ssh. Questo è importante se si utilizza il port forwarding perché, uccidendo SOLO l'istanza di autossh non si uccide il tunnel, si impedisce semplicemente che si riconnetta se / quando si disconnette definitivamente.

Puoi anche specificare un termine di ricerca (nome host) per uccidere solo tunnel specifici.

autossh --kill dbserver1uccide solo le connessioni a dbserver1
autossh --kill dbserverucciderà dbserver1, dbserver2, ecc.
autossh --kill dbserverucciderà TUTTE le connessioni autossh

Per chiarire, DOVREBBE uccidere solo le sessioni SSH avviate da autossh.

Se corri ps aux | grep sshmentre hai entrambe le sessioni autossh e ssh in corso, vedrai che quelle avviate da autossh usano il percorso completo (/ usr / bin / ssh e / usr / lib / autossh / autossh).
Questo script abbina i risultati solo ai processi avviati con il percorso speicifc. L'ho fatto perché io (e presumo che la maggior parte delle persone) di solito scrivo sshe non l'intero percorso, il che gli impedisce di uccidere le mie normali sessioni SSH.

Spero che questo aiuti gli altri.


qualche motivo particolare per $(which autossh)anziché semplicemente autossh?
MestreLion,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.