Wie stoppe / töte ich einen Autotunnel?

17

Was ist nun der richtige Weg, um einen Autossh-Tunnel zu stoppen?

Es scheint keinen einfachen Weg zu geben, dies zu tun. Die Dokumentation ist in diesem Bereich unklar.

Der einfache Weg scheint zu sein, die Maschine neu zu starten? Ist das richtig?

weiß
quelle

Antworten:

21

Nein, der richtige Weg zu töten autosshist einfach, den Prozess zu töten autossh, sonst nichts.

Der Grund ist

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

Das autosshist einfach ein Shell-Skript, kein Dienst . Es startet ein neues Programm, in seiner allerletzten Zeile,

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

wieder kein service. Was exec(Sie können es im Wiki der Bash-Hacker noch einmal überprüfen ) betrifft, so handelt es sich um einen Shell-eingebauten Befehl, der die aktuelle Shell durch den folgenden Befehl ersetzt ( /usr/lib/autossh/autossh "$@"in diesem Fall), ohne einen neuen Prozess zu starten. Die einzige Möglichkeit, dies zu stoppen, autosshbesteht beispielsweise darin, das aufrufende Skript zu beenden

pkill -3 autossh

( Vielen Dank an dviljoen, der darauf hingewiesen hat, wie wichtig es ist, das Flag -3 zu verwenden, siehe unten). Im Übrigen sshfunktioniert das Beenden der Verbindung nicht, da der aufrufende Befehl ( dh der oben genannte) einfach eine neue Verbindung startet, sobald er feststellt, dass die alte Verbindung getrennt wurde.

MariusMatutiae
quelle
1
Eigentlich solltest du autossh ohne die -9 töten. Wenn bereits eine Verbindung über den Tunnel hergestellt wurde, wird ein untergeordneter sshd-Prozess gestartet, der die Verbindung herstellt. Wenn Sie den übergeordneten Autossh mit -9 beenden, wird der sshd-Prozess beendet. Der Tunnel wird weiterhin betrieben, bis das Timeout des SSHD-Prozesses abgelaufen ist. Wenn Sie das Standardsignal (-3) für den Kill verwenden, wird er ordnungsgemäß heruntergefahren und nimmt den erzeugten sshd-Prozess mit.
Dviljoen
Hallo, da -3 das Standard-Kill-Signal ist, müssen Sie -3 nicht explizit übergeben, Sie können es weglassen
Andrés Alcarraz
@ AndrésAlcarraz Bist du dir wirklich sicher? SIGTERMist die Standardeinstellung und diese ist 15. SIGQUITist 3, siehe superuser.com/questions/352147/what-does-kill-3-mean und en.wikipedia.org/wiki/Kill_(command) - Auch FWIW, ich habe gerade überprüft und -15nicht herunter es nicht nach unten, so SIGTERMkann nicht verwendet werden.
Daniel F
Und die Verwendung pkillohne Signal (= das default) endet auch nicht autossh.
Daniel F
@ DanielF Sie haben Recht, ich war y das "Standard-Signal (-3)" von dvijoen Kommentar verwirrt
Andrés Alcarraz
5

starte auto ssh mit:

AUTOSSH_PIDFILE=/var/run/tunnel.pid autossh

töte es mit:

kill pid

BTW

pkill -9 autossh ist falsch

-9Stellt sicher, dass der Prozess nicht ordnungsgemäß beendet wird, sodass der Prozess nach dem Beenden sshimmer noch vorhanden autosshist

Ohne -9ist es immer noch schlimm, wenn Sie mehrere Tunnel laufen haben, pkillwerden sie alle töten

richtige weise ist es AUTOSSH_PIDFILEenv var dann nur killdiese pid zu setzen

Erik
quelle
Willkommen bei Super User. Anscheinend ist Ihr letzter Absatz Ihre eigentliche Antwort, während der Rest Ihrer Frage ein Kommentar zu einer anderen Antwort ist . In Anbetracht der Frage-und-Antwort-Eigenschaften dieser Website ist es hilfreich, Ihrer Antwort genügend Details hinzuzufügen, damit sie für sich allein stehen kann. Vielen Dank für Ihren Beitrag und vergessen Sie nicht, sich die Tour anzuschauen .
Ich sage Reinstate Monica
4

Suche nach dem Prozess:

ps aux | grep ssh

Die zweite Spalte ist die PID-Nummer

Kill-Prozess von PID :)

kill -9 PIDnumber

Verwenden Sie sudo, wenn Sie keine Root-Rechte haben.

NIZ
quelle
1

Ich weiß, dass dies beantwortet wurde, aber im Gegensatz zu den obigen Kommentaren werden pkill -3 autosshdie untergeordneten sshd-Prozesse für mich durch die Verwendung von NICHT beendet.

Ich benutze diese Funktion in meiner .bashrcDatei.
Im Grunde ist es so, als würde --killman autossh ein Argument hinzufügen.

  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

Sie können die Pfade auf Ihrem System ausführen which sshund which autosshüberprüfen.

Solange das erste Argument nicht --killzutrifft, werden die Argumente nur an autossh weitergegeben.

Dieses Skript beendet die autossh & ssh-Instanzen. Dies ist wichtig, wenn Sie die Portweiterleitung verwenden, da NUR durch das Beenden der autossh-Instanz der Tunnel nicht beendet wird, sondern nur verhindert wird, dass die Verbindung wiederhergestellt wird, wenn die Verbindung endgültig getrennt wird.

Sie können auch einen Suchbegriff (Hostname) angeben, um nur bestimmte Tunnel zu beenden.

autossh --kill dbserver1tötet nur die Verbindungen zu dbserver1
autossh --kill dbserverdbserver1 töten, dbserver2 usw.
autossh --kill dbservertötet alle autossh Verbindungen

Zur Verdeutlichung SOLLTE es nur die von autossh gestarteten SSH-Sitzungen beenden.

Wenn Sie ausführen, ps aux | grep sshwährend sowohl autossh- als auch ssh-Sitzungen ausgeführt werden, werden Sie feststellen, dass diejenigen, die mit autossh gestartet wurden, den vollständigen Pfad verwenden (/ usr / bin / ssh und / usr / lib / autossh / autossh).
Dieses Skript vergleicht nur Ergebnisse mit Prozessen, die mit dem Pfad "speicifc" gestartet wurden. Ich habe dies getan, weil ich (und ich nehme an, die meisten Leute) normalerweise tippe sshund nicht den vollständigen Pfad, wodurch verhindert wird, dass meine normalen SSH-Sitzungen beendet werden.

Hoffe das hilft anderen.

KeithMcFly
quelle
einen bestimmten Grund für $(which autossh)statt einfach autossh?
MestreLion