Можно ли сделать сбой SSH при сбое переадресации порта?

11026
Matt Joiner

Если я делаю переадресацию удаленного порта, например, -R 3690:localhost:3690когда привязка к порту на удаленном хосте уже существует, я получаю это предупреждение:

Warning: remote port forwarding failed for listen port 3690 

Есть ли способ вызвать ошибку ssh (то есть выйти с ненулевым кодом возврата), а не просто выдать предупреждение?

32
Вам на самом деле нужно сделать также терминальный канал или просто переадресацию? Ignacio Vazquez-Abrams 13 лет назад 0
@ IgnacioVazquez-Abrams: только пересылка. Matt Joiner 12 лет назад 1

2 ответа на вопрос

53
Andrew Schulman

Бежать

ssh -o "ExitOnForwardFailure yes" ... 

или положить

ExitOnForwardFailure yes 

в ~/.ssh/config. Смотрите ssh_config(1)использование manдля деталей.

К сожалению, у меня OpenSSH 4. Можете ли вы сказать мне, когда эта функция была добавлена? Matt Joiner 13 лет назад 0
Нет, я этого не знаю. Это может быть функция версии 5. Но версии 4 должно быть уже много лет, и есть [исправления безопасности] (http://openssh.org/security.html) все время. Если вы не можете обновить сервер самостоятельно, вы можете спросить у администратора сервера, считает ли он, что использовать эту версию безопасно. Andrew Schulman 13 лет назад 2
Имейте в виду, что если вы не укажете явно `bind_address`, тогда ssh может все еще не работать. Например, если другой пользователь уже прослушивает ipv6 localhost `[:: 1]: 3690`, тогда ssh может связать только ipv4` 127.0.0.1: 3690` и не будет жаловаться. Но ваш клиент SVN, вероятно, предпочел бы сокет ipv6 (атакующего). Для безопасности лучше использовать `-R [:: 1]: 3690: localhost: 3690 -R 127.0.0.1: 3690: localhost: 3690` rudimeier 7 лет назад 0
1
Antti Rytsölä Circles Consult

Я использую скрипт bash на целевом хосте, чтобы убедиться, что переадресация была открыта правильно. Соединение SSH запустит это и завершит работу, если есть проблема с переадресацией порта, например

клиентский скрипт: (для настройки переадресации портов используется .ssh / config)

#!/bin/bash   while true; do echo -n starting at : " date ssh user@server bin/sshloop.sh echo "got back, sleeping 17 " sleep 17 done  

серверный скрипт (bin / sshloop.sh)

#!/bin/bash  while true; do  echo $(date)" : SSH Reverse 1090:80, 1232:22 From Server to Client" sleep 17 if ! netstat -an | grep -q ":::1090 " ; then echo "1090 forward missing, bailing out" exit fi done 

Может быть, даже запустить сценарий на стороне клиента под экраном с -dmS

Случай, которого я пытаюсь избежать, заключается в том, что порт пересылки уже существует, и выдается предупреждение. Я думаю, что этот сценарий будет рассматривать существующую привязку к порту как успех, а не сбой. Matt Joiner 12 лет назад 1
Это правда. Моя проблема была в том же скрипте, который удерживал порт открытым в течение нескольких минут до истечения времени ожидания. Этот сценарий будет завершен несколько раз, после чего порт снова будет открыт. Если вам нужно точно знать, кто владеет портом, попробуйте запустить netstat -anp с помощью sudo и отключить его. Antti Rytsölä Circles Consult 12 лет назад 0

Похожие вопросы