Динамический порт конфигурации SSH с ProxyCommand и BASH-скриптом

У меня есть настройка сервера для рандомизации его порта SSH через определенное время и публикации порта в файле.txt, доступном на его веб-сервере. Затем я написал на своем клиенте простой скрипт, который выбирает новый порт из файла.txt веб-сервера и обновляет номер порта определенного хоста в ~/.ssh/config.

Поскольку ~/.ssh/config не может анализировать переменные Bash, я вызываю скрипт с помощью ProxyCommand (я использую JumpHost, а порт JH является динамическим портом).

Мой ~/.ssh/config выглядит следующим образом:

Host jumphost
HostName jumphost.example.com
Port 51638
User bob
StrictHostKeyChecking no
UserKnownHostsFile=/dev/null

Host myserver
HostName myserver.com
Port 2222
User bob
ProxyCommand ~/.ssh/get_dynamic_port.sh ssh -W %h:%p jumphost

Сценарий Bash выглядит следующим образом (get_dynamic_port.sh):

#!/bin/sh
PORT=$(curl -s http://jumphost.example.com/port.txt)
OLDIP=`grep -w "jumphost.example.com" -A 1 ~/.ssh/config | awk '/Port/ {print $2}'`
LINE_NUMBER=`grep -n "jumphost.example.com" -A 1 ~/.ssh/config | grep -v "jumphost.example.com" | awk '{print $1}' FS="-"`
sed -i'.bak' -e "${LINE_NUMBER}s/$OLDIP/$PORT/" ~/.ssh/config

Сценарий работает нормально и обновляет порт для jumphost.example.com, но, к сожалению, я не могу подключиться, ssh работает в отладочном выводе ниже:

macosx:$ ssh -vvv myserver
OpenSSH_7.9p1, LibreSSL 2.7.3
debug1: Reading configuration data ~/.ssh/config
debug1: ~/.ssh/config line 54: Applying options for myserver
debug1: Reading configuration data /etc/ssh/ssh_config
debug1: /etc/ssh/ssh_config line 48: Applying options for *
debug1: Executing proxy command: exec ~/.ssh/get_dynamic_port.sh ssh -W myserver:2222 jumphost
debug1: identity file ~/.ssh/id_rsa type -1
debug1: identity file ~/.ssh/id_rsa-cert type -1
debug1: identity file ~/.ssh/id_dsa type -1
debug1: identity file ~/.ssh/id_dsa-cert type -1
debug1: identity file ~/.ssh/id_ecdsa type -1
debug1: identity file ~/.ssh/id_ecdsa-cert type -1
debug1: identity file ~/.ssh/id_ed25519 type -1
debug1: identity file ~/.ssh/id_ed25519-cert type -1
debug1: identity file ~/.ssh/id_xmss type -1
debug1: identity file ~/.ssh/id_xmss-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_7.9
ssh_exchange_identification: Connection closed by remote host

Следует отметить, что отслеживание безопасного файла журнала на сервере Jumphost не показывает никаких попыток подключения, которые могут быть признаком того, что не так.

Конфигурация jumphost прекрасно работает без сценария динамического порта, и, как указано выше, скрипт фактически корректно меняет порт Jumphost, но после этого ssh просто перестает работать.

Будем благодарны за любые идеи о том, как этого добиться или что я могу делать неправильно. Я мог бы просто использовать запись в crontab, чтобы запускать скрипт время от времени для обновления порта Jumphost, но я бы предпочел, чтобы порт Jumphost обновлялся только при установлении соединения с ним, это кажется немного чище.

Спасибо:)

1 ответ

Решение

Современный способ использования "прыжков" с -J вариант (ProxyJump).

С использованием ProxyCommand опция все еще работает и имеет гибкость для запуска произвольного кода установки, вызывая скрипт, как здесь. Тем не менее, ваш код должен, в конечном счете, выполнить соответствующую команду ssh для выполнения "прыжка".

Типичная опция конфигурации выглядит следующим образом:

Host jump
    Hostname jumphost.fqdn
    User juser

Host final
    Hostname final.fqdn
    User fuser
    ProxyCommand ssh -W %h:%p jump

Ты бежишь ssh final который открывает соединение с локального хоста jumpзатем еще один из jump в final с включенной необходимой переадресацией.

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

Учитывая строку конфигурации, как ваш:

ProxyCommand ~/.ssh/get_dynamic_port.sh ssh -W %h:%p jumphost

Самый простой способ вызвать обычную команду ssh (которую вы передаете в качестве аргументов скрипту оболочки) - это вызвать ее в конце:

#!/bin/sh

# ... custom stuff ...

# new final line:
eval "$@"
Другие вопросы по тегам