Динамический порт конфигурации 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 "$@"