Comment arrêter / tuer un tunnel d'autossh?

17

Maintenant que j'ai un tunnel autossh, quelle est la bonne façon de l'arrêter?

Il ne semble pas y avoir de moyen facile de procéder. La documentation n'est pas claire sur cette partie.

Le moyen le plus simple semble être de redémarrer la machine? Est-ce correct?

onknows
la source

Réponses:

21

Non, la bonne façon de tuer autosshest simplement de tuer le processus autossh, rien d'autre.

La raison est

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

c'est autosshsimplement un script shell, pas un service . Il démarre un nouveau programme, dans sa toute dernière ligne,

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

encore une fois pas un service. Quant à exec(vous pouvez le vérifier dans le wiki des pirates Bash ), il s'agit d'une commande intégrée au shell qui remplace le shell actuel par la commande suivante ( /usr/lib/autossh/autossh "$@"dans ce cas) sans démarrer un nouveau processus. Donc, la seule façon d'arrêter autosshest de tuer le script appelant, par exemple

pkill -3 autossh

(merci à dviljoen d' avoir souligné l'importance d'utiliser l' indicateur -3 , voir ci-dessous). Par ailleurs, la suppression de la sshconnexion ne fonctionnera pas, car la commande appelante ( c'est-à - dire celle ci-dessus) démarrera simplement une nouvelle connexion dès qu'elle réalisera que l'ancienne a été supprimée.

MariusMatutiae
la source
1
En fait, vous devriez tuer autossh sans -9. Si une connexion a déjà été établie via le tunnel, il aura généré un processus sshd enfant pour le gérer. Tuer le parent autossh avec -9 laissera le processus sshd derrière. Le tunnel continuera de fonctionner jusqu'à l'expiration du processus sshd. Si vous utilisez le signal par défaut (-3) sur le kill, il s'arrêtera gracieusement et prendra le processus sshd généré avec lui.
dviljoen
salut comme -3 est le signal de mise à mort par défaut, vous n'avez pas besoin de passer explicitement -3, vous pouvez l'omettre
Andrés Alcarraz
@ AndrésAlcarraz Vous en êtes vraiment sûr? SIGTERMest la valeur par défaut, et celle-là l'est 15. SIGQUITest 3, voir superuser.com/questions/352147/what-does-kill-3-mean et en.wikipedia.org/wiki/Kill_(command) - Aussi, FWIW, je viens de vérifier et -15ne l'arrête pas, SIGTERMne peut donc pas être utilisé.
Daniel F
Et l'utilisation pkillsans signal (= le default) ne se termine pas non plus autossh.
Daniel F
@DanielF tu as raison, j'étais confus y le "signal par défaut (-3)" de dvijoen comment
Andrés Alcarraz
5

lancez auto ssh avec:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

tuez-le avec:

kill pid

BTW

pkill -9 autossh est un tort

-9s'assure que le processus ne se termine pas correctement, donc le sshprocessus est toujours là quand le autosshprocessus est tué

sans -9est toujours mauvais, si vous avez plusieurs tunnels en cours d'exécution, pkillles tuera tous

la bonne façon est de définir AUTOSSH_PIDFILEenv var alors killque pid seulement

Erik
la source
Bienvenue dans Super User. Il semble que votre dernier paragraphe soit votre réponse réelle, tandis que le reste de votre question est un commentaire sur une autre réponse . Étant donné la nature des questions et réponses de ce site, il serait utile d'ajouter suffisamment de détails à votre réponse pour qu'elle puisse se suffire à elle-même. Merci d'avoir contribué et n'oubliez pas de consulter la tournée .
Je dis Reinstate Monica
4

Recherchez le processus:

ps aux | grep ssh

La deuxième colonne est le PIDnumber

Tuer le processus par PID :)

kill -9 PIDnumber

Utilisez sudo si vous ne disposez pas des privilèges root.

NIZ
la source
1

Je sais que cela a été répondu, mais contrairement aux commentaires ci-dessus, l'utilisation pkill -3 autosshne tue PAS les processus enfants sshd pour moi.

J'utilise cette fonction dans mon .bashrcfichier.
Fondamentalement, c'est comme ajouter un --killargument à 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

Vous pouvez exécuter which sshet which autosshvérifier les chemins sur votre système.

Tant que le premier argument ne l'est pas --kill, il passe simplement les arguments à autossh.

Ce script tue les instances autossh & ssh. Ceci est important si vous utilisez la redirection de port car, en tuant UNIQUEMENT l'instance autossh ne tue pas le tunnel, cela l'empêche simplement de se reconnecter si / quand il se déconnecte finalement.

Vous pouvez également spécifier un terme de recherche (nom d'hôte) pour supprimer uniquement des tunnels spécifiques.

autossh --kill dbserver1tue uniquement les connexions à dbserver1
autossh --kill dbservertuera dbserver1, dbserver2, etc.
autossh --kill dbservertuera TOUTES les connexions autossh

Pour clarifier, il DEVRAIT tuer uniquement les sessions SSH démarrées par autossh.

Si vous exécutez ps aux | grep sshalors que vous avez à la fois des sessions autossh et ssh en cours d'exécution, vous verrez que celles démarrées par autossh utilisent le chemin complet (/ usr / bin / ssh et / usr / lib / autossh / autossh).
Ce script ne fait correspondre les résultats qu'aux processus démarrés avec le chemin speicifc. Je l'ai fait parce que je (et je suppose que la plupart des gens) tapent généralement sshet non le chemin complet, ce qui l'empêche de tuer mes sessions ssh normales.

J'espère que cela aidera les autres.

KeithMcFly
la source
une raison particulière pour $(which autossh)au lieu de simplement autossh?
MestreLion