Динамический порт конфигурации SSH с ProxyCommand и BASH-скриптом - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть настройка сервера для рандомизации его порта 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 Ответ

0 голосов
/ 26 февраля 2019

Современный способ использования «jumphosts» - с опцией -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, который открываетподключение от localhost к 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 "$@"
...