Я нахожусь на соединении, которое постоянно пропадает, что раздражает, но я не могу с этим поделать. Я подключаюсь к SSH, используя -R 9000:localhost:9000 (для отладки с помощью xdebug).

Проблема заключается в том, что когда я отключаюсь и снова подключаюсь, сервер все еще видит предыдущее соединение через порт 9000, а когда я пытаюсь загрузить веб-страницу, сервер пытается отправить данные XDEBUG в мертвое соединение SSH.

Если я запускаю netstat -nlp | grep 9000 Я вижу, что старое соединение открыто, и я могу его убить. Если после этого я снова подключусь, то переадресация портов перейдет к новому соединению, и все снова начнет работать.

Есть ли способ заставить сервер уничтожить этот процесс, когда есть сломанный канал? (Я думаю, что он может не знать, что связь разорвана)

ИЛИ ЖЕ

Есть ли способ, которым, когда я подключаюсь обратно к SSH с переадресацией портов для того же порта, он распознает, что уже открыто другое соединение (мертвое соединение) и завершает этот процесс, чтобы новое соединение принимало переадресацию портов?

1 ответ1

0

Я полагаю, что это сработает (сработало в моих экспериментах, хотя я мог прервать соединение только вручную, поэтому не уверен, точно ли я воспроизвел ваш сценарий со сломанной трубой):

ssh -o ExitOnForwardFailure=true -R 9000:localhost:9000 -Nf remote-server

Основной трюк в том, что вы создаете "автономное" ssh-соединение только с целью переадресации портов и помещения его в фоновый режим (-Nf опции). Таким образом, когда соединение прекращается (например, сломанная труба), порт должен освободиться.

Параметр ExitOnForwardFailure только для того, чтобы в следующий раз, когда вы попытаетесь установить соединение, вы увидели на STDOUT тот факт, что порт все еще открыт на сервере. Если вам все еще нужно сделать что-то более сложное, чтобы вручную завершить соединение на сервере, вы можете использовать код выхода из отказавшего ssh с опцией ExitOnForwardFailure чтобы сделать что-то более сложное.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .