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

39

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

Warning: remote port forwarding failed for listen port 3690

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

Мэтт Столяр
источник
Вам на самом деле нужно сделать также терминальный канал или просто переадресацию?
Игнасио Васкес-Абрамс
1
@ IgnacioVazquez-Abrams: только пересылка.
Мэтт Столяр

Ответы:

63

Бег

ssh -o "ExitOnForwardFailure yes" ...

или положить

ExitOnForwardFailure yes

в ~/.ssh/config. Смотрите man ssh_configподробности.

Эндрю Шульман
источник
К сожалению, у меня OpenSSH 4. Можете ли вы сказать мне, когда эта функция была добавлена?
Мэтт Столяр
2
Нет, я этого не знаю. Это может быть функция версии 5. Но версии 4 должно быть уже много лет, и исправления безопасности все время существуют. Если вы не можете обновить сервер самостоятельно, вы можете спросить администратора сервера, считает ли он, что использовать эту версию безопасно.
Эндрю Шульман
Имейте в виду, что если вы не укажете явно, 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
3
Можно также использовать ssh -o ExitOnForwardFailure = yes, чтобы избежать пробелов и необходимости заключать в кавычки.
свободное пространство
1

Я использую скрипт 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

Antti Rytsölä Circles Consult
источник
2
Случай, которого я пытаюсь избежать, заключается в том, что порт переадресации уже существует, и выдается предупреждение. Я думаю, что этот сценарий будет рассматривать существующую привязку к порту как успех, а не как сбой.
Matt Joiner
1
Это правда. Моя проблема была в том же скрипте, который удерживал порт открытым в течение нескольких минут до истечения времени ожидания. Этот сценарий завершился бы несколько раз, после чего порт снова был бы открыт. Если вам нужно точно знать, кто владеет портом, попробуйте запустить netstat -anp с помощью sudo и посмотреть его.
Antti Rytsölä Circles Consult
@ AnttiRytsöläCirclesConsult: обратите внимание, что вам может потребоваться проверка идентификатора процесса, например, сопоставление по «ssh», поскольку имя процесса все еще не сообщает вам, какой из клиентов SSH в данный момент пересылает этот порт.
Писквор