Wie beendete man SSH-Tunnel?

Alle weiteren Dienste, die nicht in die drei oberen Foren gehören.
Antworten
Filidore
Beiträge: 6
Registriert: 01.10.2017 21:18:09

Wie beendete man SSH-Tunnel?

Beitrag von Filidore » 11.03.2019 22:07:56

Hallo,

in letzter Zeit benutze ich immer wieder mal SSH-Remote-Tunnel.

Sehr praktische und sehr Sache, mit der man nicht jedesmal einen Port an der Firewall aufmachen muss.

Leider passiert es manchmal, dass diese Ports (durch einen vorzeitigen unerwarteten DC) längere Zeit aktiv bleiben und die entsprechenden Ports nicht mehr benutzt werden können.


Da habe ich nur die Wahl, den Server neuzustarten


Gibt es da vielleicht eine einfachere Methode, alle bestehenden Tunnel-Ports wieder zu schliessen?

dirk11
Beiträge: 2818
Registriert: 02.07.2013 11:47:01

Re: Wie beendete man SSH-Tunnel?

Beitrag von dirk11 » 12.03.2019 00:12:30

Mit
ps aux
die laufenden Tasks anzeigen lassen, den Tunnel erkennen (das ist nicht schwer) und mit kill -9 pid beenden. Mal davon abgesehen, dass eine Tunnel-Leiche im Hintergrund keinen Port besetzt, so daß er "nicht mehr benutzt werden kann".

Benutzeravatar
heisenberg
Beiträge: 3542
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie beendete man SSH-Tunnel?

Beitrag von heisenberg » 12.03.2019 09:08:53

dirk11 hat geschrieben: ↑ zum Beitrag ↑
12.03.2019 00:12:30
...mit kill -9 pid beenden.
Es ist eine sehr schlechte Angewohnheit sofort mit Signal 9(KILL) Prozesse bedingungslos und ohne Not abzuschießen. Signal 9 heisst: Den Prozess sofort beenden, ohne dass dieser die Chance hat noch irgend etwas zu tun um ordnungsgemäss zu beenden, z. B. das hier...
  • Keine Aufräumarbeiten von temporären Dateien,
  • Kein ordentliches schließen von Sockets,
  • Keine information von erzeugten Kindprozessen über das Prozessende
  • Kein Zurücksetzen der Terminaleinstellungen auf Ausgangszustand
Das mag in dem Fall vielleicht noch ohne gravierende Konsequenzen sein, aber in anderen Fällen kann es durchaus auch mal einen kaputten Dienst hinterlassen.

Besser wäre beispielsweise mal mit diesen Signalen aufsteigende Reihenfolge, von denen jeweils der nächstdrastischere verwendet wird, wenn ein Prozeß sich nicht beenden möchte:
  • TERM (15)
  • INT (2)
  • HUP (1)
  • KILL (9) --- Erst dann nutzen, wenn die anderen Signale ohne Wirkung bleiben.
Siehe:

Code: Alles auswählen

man 7 signal
Als Bash-Funktion die einem das vereinfacht:

Code: Alles auswählen

soft_kill() {
   local pid="$1"
   for signal in TERM INT HUP KILL ;do
     # Wenn der Prozess noch lebt, ihm das aktuelle Signal schicken.
     kill -0 $pid && kill -$signal $Pid 
     sleep 5
   done
}
# Aufruf:

soft_kill 12345
Anmerkungen

Das Signal 0 ist ein Pseudosignal, dass prüft, ob man das Recht hat dem angegebenen Prozess ein Signal zu senden und ob dieser Prozess überhaupt noch existiert.

Manche Prozesse brauchen bedeutend länger, um sich ordnungsgemäß herunterzufahren. (Z. B. Java-Anwendungsserver).
Zuletzt geändert von heisenberg am 13.03.2019 09:21:00, insgesamt 1-mal geändert.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Filidore
Beiträge: 6
Registriert: 01.10.2017 21:18:09

Re: Wie beendete man SSH-Tunnel?

Beitrag von Filidore » 12.03.2019 19:19:53

dirk11 hat geschrieben: ↑ zum Beitrag ↑
12.03.2019 00:12:30
Mit
ps aux
die laufenden Tasks anzeigen lassen, den Tunnel erkennen (das ist nicht schwer) und mit kill -9 pid beenden. Mal davon abgesehen, dass eine Tunnel-Leiche im Hintergrund keinen Port besetzt, so daß er "nicht mehr benutzt werden kann".
Leider bleibt die "Leiche" schon noch einige Minuten.

Code: Alles auswählen

Mar 12 17:35:54 pizds sshd[19186]: error: bind: Address already in use
Mar 12 17:35:54 pizds sshd[19186]: error: channel_setup_fwd_listener_tcpip: cannot listen to port: 31433
Und da dachte ich mir, wirf die "Tunnelleichen" einfach raus, bevor reconnected wird.

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Wie beendete man SSH-Tunnel?

Beitrag von inne » 12.03.2019 20:02:43

@heisenberg: Kann man an das kill noch ein && return hängen um das sleep nicht umsonst abzuwarten? Ansonsten habe ich mir das als softkill <PID> [SLEEP] mal in PATH getan. Wobei ich gerne noch ein pidof $PID hätte wenn PID nicht numerisch ist...

dirk11
Beiträge: 2818
Registriert: 02.07.2013 11:47:01

Re: Wie beendete man SSH-Tunnel?

Beitrag von dirk11 » 12.03.2019 20:44:03

Filidore hat geschrieben: ↑ zum Beitrag ↑
12.03.2019 19:19:53
Und da dachte ich mir, wirf die "Tunnelleichen" einfach raus, bevor reconnected wird.
Dennoch belegt eine solche "Tunnelleiche" keinen Port - jedenfalls nicht so, daß sich niemand mehr verbinden kann, außer Du hast in der sshd_config die Anzahl der aktiven Verbindungen auf "1" gesetzt (was nicht klug ist).

Benutzeravatar
heisenberg
Beiträge: 3542
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie beendete man SSH-Tunnel?

Beitrag von heisenberg » 13.03.2019 09:19:27

inne hat geschrieben: ↑ zum Beitrag ↑
12.03.2019 20:02:43
Kann man an das kill noch ein && return hängen um das sleep nicht umsonst abzuwarten?
Das hilft leider nix. Das Ziel ist ja nicht dem Prozeß nur ein Signal zu schicken. Du willst ja wissen ob er auch tatsächlich weg ist. Und wenn Du gleich mit return weggehst, dann prüfst Du das ja nicht mehr.

Statt einem einfachen sleep könnte man diese Funktion verwenden:

Code: Alles auswählen

sleep_pid() {
   # Aufruf; wait_pid <PID> <Sekunden>
   # Warte in 0,1 Sekundenschritten solange bis entweder
   # PID nicht mehr existiert oder die angegebene Sekundenzahl erreicht wurde
   local pid=$1
   local steps=$(( $2 * 10 ))
   for((step=1;step<=$steps;step++));do
      kill -0 $pid 2>/dev/null || return
      sleep 0.1
   done
}
Wobei ich gerne noch ein pidof $PID hätte wenn PID nicht numerisch ist...
Ja. Kann man ja am Anfang mit pidof bzw. pgrep zu einer PID(können aber auch mehrere PIDS werden) auflösen und mit einer entsprechenden Prüfung ob numerisch oder nicht.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

inne
Beiträge: 3281
Registriert: 29.06.2013 17:32:10
Lizenz eigener Beiträge: GNU General Public License
Kontaktdaten:

Re: Wie beendete man SSH-Tunnel?

Beitrag von inne » 13.03.2019 10:26:27

heisenberg hat geschrieben: ↑ zum Beitrag ↑
13.03.2019 09:19:27
inne hat geschrieben: ↑ zum Beitrag ↑
12.03.2019 20:02:43
Kann man an das kill noch ein && return hängen um das sleep nicht umsonst abzuwarten?
Das hilft leider nix. Das Ziel ist ja nicht dem Prozeß nur ein Signal zu schicken. Du willst ja wissen ob er auch tatsächlich weg ist. Und wenn Du gleich mit return weggehst, dann prüfst Du das ja nicht mehr.
Stimmt natürlich.

Wobei ich gerne noch ein pidof $PID hätte wenn PID nicht numerisch ist...
Kann man ja am Anfang mit pidof bzw. pgrep zu einer PID(können aber auch mehrere PIDS werden) auflösen und mit einer entsprechenden Prüfung ob numerisch oder nicht.
Was ist von dieser Abfrage dafür zu halten? Also bei einem Namen/nicht numerischen Wert statt kill das killall zu verwenden. Kann man das machen?

Code: Alles auswählen

[...]
Haben die 5 Sekunden von dir, eine Bewandtnis und nimmt man nicht immer 10? Dazu werde ich es wohl doch als killsoft abspeichern, um mit der Autovervollständigung daran erinnert zu werden, wenn ich kill vervollständige. Denn kill/killall nutzt man so selten. Ich werde bei der Benutzung sehen ob es Sinn macht und funktioniert.
Zuletzt geändert von Anonymous am 15.03.2019 08:21:05, insgesamt 1-mal geändert.

Benutzeravatar
heisenberg
Beiträge: 3542
Registriert: 04.06.2015 01:17:27
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie beendete man SSH-Tunnel?

Beitrag von heisenberg » 13.03.2019 11:06:00

Verwendung von killall

Man sollte vielleicht im Hinterkopf behalten, dass killall auf anderen Systemen als (Debian) Linux eine ganz andere Bedeutung hat:

Z. B. OpenSolaris: killall - kill all active processes (https://www.unix.com/man-page/opensolaris/1m/killall/)

Vielleicht doch lieber pkill verwenden?

Code: Alles auswählen

for((step=1;step<=$_steps;step++));do
Tippfehler(_steps statt steps).

Code: Alles auswählen

$kill -0 "$pid" || return && $kill -$signal "$pid"
Das funktioniert nicht so wie gewünscht. Der kill wird nur ausgeführt wenn der return erfolgreich ist. --> Reihenfolge umkehren...

Code: Alles auswählen

$kill -0 "$pid" && $kill -$signal "$pid" || return
Aber 100% klar erklären kann ich auch nicht, warum das eine funktioniert und das andere nicht.
Haben die 5 Sekunden von dir, eine Bewandtnis und nimmt man nicht immer 10?
5 war eine willkürliche Wahl.

---

Anonsten: Testen und schauen ob alle Fälle richtig abgearbeitet werden.
Jede Rohheit hat ihren Ursprung in einer Schwäche.

Antworten