ssh -L (błąd: powiązanie: Adres już używany)

48

Całkiem proste, wiem, że zdarzyło mi się to wcześniej. Nie udało się znaleźć dobrej odpowiedzi na temat AU.

Uruchomiłem sesję ssh z portami powiązanymi:

ssh -L 3000:<server_name>:22

Właśnie straciłem połączenie. Kiedy próbuję połączyć się ponownie za pomocą tego samego polecenia, pojawia się następujący błąd:

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

Jak zresetować ssh na moim komputerze, aby umożliwić ponowne powiązanie portu? Resetowanie komputera lokalnego działa.

kbuilds
źródło

Odpowiedzi:

66

Czy nie możesz po prostu zabić tego, co korzysta z tego portu?

 lsof -ti:5901 | xargs kill -9

lsof -ti:5901znaleźć cokolwiek używa portu 5901.

Przekaż wszystko, kill -9aby zabić wszystko, co korzystało z portu 5901.

Zastąp port, który chcesz ponownie otworzyć.

użytkownik974407
źródło
Tak, możesz zmienić numer portu na dowolny blokowany port. Oznaczę to jako odpowiedź.
kbuilds
Jeśli jesteś ostrożny i / lub zapominający, tak jak ja, możesz samodzielnie uruchomić lsof i dowiedzieć się, jaki jest proces, zanim go zabijesz. lsof -ti:5901powróci szereg procesów, które następnie przechodzą dokill -9
octern
3
co jeśli nic nie używa portu 5901 (lub innego portu lokalnego, który określasz)?
Michael
Spróbuj, sudojeśli proces się nie pojawilsof
bogate przypomnienie
2
Nie ma powodu, aby kill -9program nie reagował całkowicie . Zabicie procesu sygnałem nr 9 (SIGKILL) powoduje jego natychmiastowe zakończenie, nie dając szansy na opróżnienie buforów, zamknięcie uchwytów plików i gniazd, usunięcie plików tymczasowych itp., A wszystko to można zrobić, jeśli go użyjesz kill(domyślnie SIGTERM) , następnie kill -1(SIGHUP; rozłączanie) i kill -2(SIGINT; co Ctrl + C wysyła), jeśli to nie działa, i na koniec, kill -9 jeśli nic innego nie działa .
TheDudeAbides,
12

Przypuszczam, że wciąż masz coś podłączonego do lokalnego portu 3000.

Możesz to znaleźć za pomocą

netstat -tulpn | grep 3000 

a następnie pozbyć się tego. Na przykład w mojej maszynie:

[:~] % 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

poprawnie identyfikuje proces oczekujący i podłączony do portu 5900 (serwer VNC).

Innym przydatnym poleceniem jest

fuser 3000/tcp 

... wszystkie mogą wymagać uruchomienia, sudojeśli nie jesteś właścicielem procesu otwierającego port.

Rmano
źródło
Dziękuję za odpowiedź. Będę musiał się w to zagłębić, aby zobaczyć, czy mogę odtworzyć problem. Jedyną możliwą aplikacją, która mogła nasłuchiwać na porcie 3000, była stara sesja ssh, która została odłączona. Mój użytkownik był właścicielem tego procesu, więc założyłem, że będę mógł uruchomić killall sshi zginąć. Chyba tak nie jest
kbuilds
Dzięki za przypomnienie sudo- tego mi brakowało.
ACV
5

Byłem w stanie odtworzyć i naprawić, wykonując następujące czynności:

  • Otwórz coś, co wyświetli listę twoich procesów ( ps -ae)
  • Zabij proces o nazwie sh( kill <proc_number>)

Następnie ponownie otwórz połączenie ssh

Alternatywnie, odniosłem sukces z:

killall ssh

W terminalu na lokalnej maszynie

kbuilds
źródło
2

jeszcze jeden pretendent: ss

można go użyć w następujący sposób: ss -ltp | grep 3000aby znaleźć program nasłuchujący na porcie 3000

mnagel
źródło