ssh -L (ошибка: bind: адрес уже используется)

48

Довольно просто, я знаю, что это случилось со мной раньше. Не удалось найти хороший ответ на AU.

Я запустил сессию SSH с привязанными портами:

ssh -L 3000:<server_name>:22

Я только что потерял связь. Когда я пытаюсь восстановить соединение с помощью той же команды, я получаю следующую ошибку:

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

Как я могу сбросить SSH на моей машине, чтобы разрешить привязку порта снова? Сброс локальной машины работает.

kbuilds
источник

Ответы:

67

Не могли бы вы просто убить то, что использует этот порт?

 lsof -ti:5901 | xargs kill -9

lsof -ti:5901чтобы найти то, что использует порт 5901.

Передайте все это, чтобы kill -9убить все, что использовало порт 5901.

Замените на порт, который вы хотите открыть снова.

user974407
источник
Да, вы можете изменить номер порта на любой порт, который блокируется. Я собираюсь отметить это как ответ.
kbuilds
Если вы осторожны и / или забывчивы, как я, вы можете запустить lsof самостоятельно и выяснить, что это за процесс, прежде чем убить его. lsof -ti:5901вернет номер процесса, который вы затем передадитеkill -9
октябрь
3
Что делать, если ничто не использует порт 5901 (или любой другой локальный порт, который вы указываете)?
Майкл
Попробуйте, sudoесли процесс не идетlsof
богатый Ремер
2
Нет никаких причин, kill -9если программа полностью не отвечает. Убийство процесса с сигналом # 9 (SIGKILL) обрывается сразу , не давая процессу возможность смыва буферов, близкие дескрипторы файлов и сокеты, удалить временные файлы и т.д., все из которых процесс может сделать , если вы используете kill( по умолчанию SIGTERM) , затем kill -1(SIGHUP; зависание) и 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 server).

Еще одна полезная команда

fuser 3000/tcp 

... все они могут быть запущены, sudoесли вы не являетесь владельцем процесса, открывающего порт.

Rmano
источник
Спасибо за ответ. Я должен буду копаться в этом, чтобы видеть, смогу ли я воссоздать проблему. Единственным возможным приложением, которое могло прослушивать порт 3000, был старый сеанс ssh, который был отключен. Мой пользователь владел процессом, поэтому я предположил, что смогу запустить его killall sshи заставить его умереть. Думаю, это не так
kbuilds
Спасибо за напоминание, чтобы использовать sudo- это то, что мне не хватало.
ACV
5

Я смог воссоздать и исправить это, выполнив следующие действия:

  • Откройте что-то, что будет перечислять ваши процессы ( ps -ae)
  • Убить процесс под названием sh( kill <proc_number>)

Затем снова откройте соединение ssh

Кроме того, я имел успех с:

killall ssh

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

kbuilds
источник
2

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

это можно использовать так: ss -ltp | grep 3000найти программу, прослушивающую порт 3000

mnagel
источник