ssh -L (помилка: прив'язка: Адреса вже використовується)


48

Досить просто, я знаю, що це сталося зі мною раніше. Не вдалося знайти хорошої відповіді на АС.

Я запускав сеанс ssh із пов'язаними портами:

ssh -L 3000:<server_name>:22

Я просто втратив зв’язок. Коли я намагаюся відновити з'єднання за допомогою тієї ж команди, я отримую таку помилку:

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

Як скинути ssh на своїй машині, щоб дозволити порт знову зв'язати? Скидання роботи локальної машини.

Відповіді:


66

Чи не могли ви просто вбити все, що використовує цей порт?

 lsof -ti:5901 | xargs kill -9

lsof -ti:5901щоб знайти все, що використовує порт 5901.

Пройдіть всю справу, kill -9щоб убити все, що використовувало порт 5901.

Замініть порт, який ви хочете знову відкрити.


Так, ви можете змінити номер порту на будь-який порт, який блокується. Я відзначу це як відповідь.
kbuilds

Якщо ви обережні та / або забудькуваті, як я, ви, можливо, захочете запустити lsof самостійно і дізнатись, який процес, перш ніж його вбити. lsof -ti:5901поверне номер процесу, який ви перейдете доkill -9
16-16

3
що робити, якщо ніщо не використовує порт 5901 (або який би ви не вказали локальний порт)?
Майкл

Спробуйте, sudoякщо процес не lsof
підійде

2
Немає підстав, kill -9якщо програма повністю не реагує. Вбивство процесу із сигналом № 9 (SIGKILL) негайно припиняє його, не даючи процесу обминути буфери, закрити файлові файли та сокети, видалити тимчасові файли тощо, і все це можна зробити, якщо ви користуєтесь kill(за замовчуванням до SIGTERM) , а потім kill -1(SIGHUP; Hangup) та kill -2(SIGINT; що надсилає Ctrl + C), якщо це не працює, і, нарешті, kill -9 якщо нічого іншого не працює .
TheDudeAbides

12

Я думаю, у вас все ще є щось підключене до локального порту 3000.

Ви можете знайти його

netstat -tulpn | grep 3000 

а потім утилізуйте його. Наприклад, у моїй машині:

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

правильно ідентифікує процес очікування та підключений до порту 5900 (сервер vnc).

Ще одна корисна команда - це

fuser 3000/tcp 

... з ними, можливо, потрібно запустити, sudoякщо ви не володієте процесом, який відкриває порт.


Дякую за відповідь. Мені доведеться розкопатися, щоб побачити, чи зможу я відтворити проблему. Єдиним можливим додатком, який міг слухати на порту 3000, був старий сеанс ssh, який був відключений. Мій користувач володів процесом, тож я припускав, що зможу запустити killall sshі померти. Вгадайте, що це не так
kbuilds

Дякуємо за нагадування про використання sudo- саме цього мені не вистачало.
ACV

5

Мені вдалося відтворити і виправити це, зробивши наступне:

  • Відкрийте щось із переліком ваших процесів ( ps -ae)
  • Убийте процес, який називається sh( kill <proc_number>)

Потім знову відкрийте ssh-з'єднання

Крім того, я мав успіх у:

killall ssh

У терміналі на локальній машині


2

ще один претендент: ss

це можна використовувати так: ss -ltp | grep 3000щоб знайти програму прослуховування на порту 3000

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.