Вопрос или проблема
Если я выполняю удаленное перенаправление порта, например, -R 3690:localhost:3690
, когда уже существует привязка на порту на удаленном хосте, я получаю это предупреждение:
Warning: remote port forwarding failed for listen port 3690
Есть ли способ заставить ssh завершаться с ошибкой (т.е. выходить с ненулевым кодом возврата), вместо того чтобы просто выводить предупреждение?
Выполните
ssh -o ExitOnForwardFailure=yes ...
или добавьте в
ExitOnForwardFailure yes
в файл ~/.ssh/config
. Подробности смотрите в man ssh_config
.
Я использую скрипт 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
Может быть, даже выполнить скрипт на стороне клиента в screen
с параметром -dmS
Просто пытаюсь улучшить принятый ответ.
Действительно, ответ заключается в том, чтобы использовать опцию ExitOnForwardFailure:
ssh -o ExitOnForwardFailure=yes ...
Но будьте осторожны! При указании перенаправления порта как <port>:<ip>:<port>
ssh попытается привязаться к IPv6 (::1
) и IPv4 (127.0.0.1
), если одно из них удастся, оно не выйдет.
В большинстве случаев вы захотите, чтобы ssh завершалось, если привязка на IPv4 не удалась. В этом случае укажите это явно, используя 0.0.0.0
или 127.0.0.1
, например:
ssh -o ExitOnForwardFailure=yes -L 0.0.0.0:3690:localhost:3690 ...
Ответ или решение
Вопрос о том, как заставить SSH завершиться с ошибкой в случае сбоя перенаправления портов, является актуальной задачей в мире IT, особенно при сложных системах, где важна надежность соединений. Пример из вопроса, в котором рассматривается удаленное перенаправление порта с параметрами -R 3690:localhost:3690
, демонстрирует распространенный сценарий, когда попытка связать порт оказывается неудачной из-за его предварительной занятости на удаленном хосте.
Теория
SSH (Secure Shell) — это протокол, обеспечивающий безопасное администрирование сетевых устройств и удалённых систем. Перенаправление портов (Port Forwarding) — одна из его ключевых функций, позволяющая перенаправлять трафик через защищенное SSH-соединение. Эта функция широко используется в случаях, когда доступ к определенному ресурсу ограничен из-за сетевых политик или особенностей маршрутизации.
Проблема заключается в том, что при неудачном прецеденте перенаправления порта SSH выдаёт только предупреждение, а не завершает соединение ошибкой. Настройка ExitOnForwardFailure=yes
в SSH позволяет заставить процесс завершаться с ненулевым кодом возврата в случае сбоя перенаправления. Это критично в автоматизированных системах и сценариях, где успешное соединение напрямую влияет на выполнение последовательных операций.
Пример
Для достижения необходимой функциональности можно воспользоваться опцией ExitOnForwardFailure
, которую следует включить как напрямую в командной строке SSH, так и через конфигурационный файл ~/.ssh/config
.
1. Командная строка
Можно включить опцию при вызове SSH:
ssh -o ExitOnForwardFailure=yes -R 3690:localhost:3690 user@server
2. Конфигурационный файл SSH
Если эта настройка должна применяться ко всем подключениям, её можно добавить в файл конфигурации SSH. В конфигурации можно настроить следующую секцию:
Host *
ExitOnForwardFailure yes
Применение
В итоге, настройка ExitOnForwardFailure
в SSH обеспечивает завершение с ошибкой в случае отказа установить перенаправление порта. Хотя она решает проблему отказа, стоит учитывать несколько важных моментов:
-
IPv4 и IPv6: При попытке привязки к порту, SSH по умолчанию может пытаться сделать это как для IPv4, так и для IPv6. Если хотя бы одна из попыток будет успешной, SSH все равно установит соединение. Для строгого контроля процесса можно указать явный IP-адрес, например,
127.0.0.1
или0.0.0.0
для IPv4. -
Автоматизация и скрипты: При использовании автоматизации и скриптов, следует включить проверку кода возврата SSH для своевременного обнаружения ошибок и их последующей обработки. Это послужит более надежной структурой контроля ошибок, чем простое ожидание завершения соединения.
-
Мониторинг и Логи: Для более детальной диагностики проблемы с SSH лучше настроить более подробное логирование сеансов, что позволяет быстро выявить и исправить проблему.
В завершение, использование ExitOnForwardFailure
наряду с правильной настройкой сети и порта на системе предоставляет дополнительный уровень надежности и безопасности в управлении удаленными подключениями через SSH. Такой подход обеспечивает стабильность и предсказуемость системы, что особенно важно в корпоративных структурах и высоконагруженных сервисах.