ssh -L (Fehler: bind: Adresse wird bereits verwendet)

48

Ganz einfach, ich weiß, dass mir das schon mal passiert ist. Konnte keine gute Antwort auf AU finden.

Ich habe eine SSH-Sitzung mit gebundenen Ports ausgeführt:

ssh -L 3000:<server_name>:22

Ich habe gerade meine Verbindung verloren. Wenn ich versuche, die Verbindung mit demselben Befehl wiederherzustellen, wird die folgende Fehlermeldung angezeigt:

bind: Address already in use
channel_setup_fwd_listener: cannot listen to port: 3000

Wie setze ich ssh auf meinem Computer zurück, damit der Port wieder gebunden werden kann? Das Zurücksetzen des lokalen Computers funktioniert.

kbuilds
quelle

Antworten:

66

Könntest du nicht einfach töten, was auch immer diesen Port benutzt?

 lsof -ti:5901 | xargs kill -9

lsof -ti:5901um herauszufinden, was auch immer den Port benutzt 5901.

Übergeben Sie das Ganze, um kill -9zu töten, was auch immer den Port benutzte 5901.

Ersetzen Sie ihn durch den Port, den Sie erneut öffnen möchten.

user974407
quelle
Ja, Sie können die Portnummer in den gesperrten Port ändern. Ich werde dies als Antwort markieren.
kbuilds
Wenn Sie wie ich vorsichtig und / oder vergesslich sind, möchten Sie vielleicht selbstständig loslegen und herausfinden, wie der Vorgang abläuft, bevor Sie ihn beenden. lsof -ti:5901wird eine Prozessnummer zurückgeben, die Sie dann passierenkill -9
octern
3
Was ist, wenn nichts den Port 5901 (oder den von Ihnen angegebenen lokalen Port) verwendet?
Michael
Versuchen Sie, sudowenn der Prozess nicht lsof
aufgeht
2
Es gibt keinen Grund, kill -9es sei denn , das Programm vollständig unempfänglich. Wenn Sie einen Prozess mit Signal 9 (SIGKILL) beenden, wird er sofort beendet, ohne dass der Prozess die Möglichkeit hat, Puffer zu leeren, Dateihandles und Sockets zu schließen, temporäre Dateien zu entfernen usw. Dies alles kann der Prozess , wenn Sie es verwenden kill(standardmäßig SIGTERM). , gefolgt von kill -1(SIGHUP; Auflegen) und kill -2(SIGINT; was Strg + C sendet), wenn das nicht funktioniert und schließlich, kill -9 wenn nichts anderes funktioniert .
TheDudeAbides
12

Ich nehme an, du hast noch etwas mit dem lokalen Port 3000 verbunden.

Sie finden es mit

netstat -tulpn | grep 3000 

und dann entsorgen. Zum Beispiel in meiner Maschine:

[:~] % netstat -tulpn | grep 5900
(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
tcp        0      0 0.0.0.0:5900            0.0.0.0:*               LISTEN      2547/vino-server
tcp6       0      0 :::5900                 :::*                    LISTEN      2547/vino-server

Identifiziert den wartenden und an Port 5900 (VNC-Server) angeschlossenen Prozess korrekt.

Ein weiterer nützlicher Befehl ist

fuser 3000/tcp 

... müssen möglicherweise alle ausgeführt werden, sudowenn Sie nicht über den Prozess verfügen, der den Port öffnet.

Rmano
quelle
Danke für die Antwort. Ich muss mich damit befassen, um zu sehen, ob ich das Problem erneut erstellen kann. Die einzige mögliche Anwendung, die Port 3000 abhören konnte, war die alte SSH-Sitzung, die getrennt wurde. Meinem Benutzer gehörte der Prozess, also nahm ich an, dass ich einen ausführen killall sshund ihn sterben lassen könnte.
Schätze
Vielen Dank für die Erinnerung sudo- das hat mir gefehlt.
ACV
5

Ich konnte es folgendermaßen wiederherstellen und beheben:

  • Öffne etwas, das deine Prozesse auflistet ( ps -ae)
  • Beende den aufgerufenen Prozess sh( kill <proc_number>)

Öffnen Sie dann die SSH-Verbindung erneut

Alternativ hatte ich Erfolg mit:

killall ssh

Im Terminal auf dem lokalen Rechner

kbuilds
quelle
2

ein weiterer Anwärter: ss

es kann so benutzt werden: ss -ltp | grep 3000um das Programm zu finden, das auf Port 3000 lauscht

mnagel
quelle