Как настроить SSH-соединение, используя переменное имя хоста, предоставленное сервером jump

Как настроить SSH-соединение, используя переменное имя хоста, предоставленное сервером jump

Я хочу создать файл .sshconfig для случая, когда мне нужно подключиться к узлу входа (серверу перехода), получить имя хоста с этого узла, выполнив команду, а затем подключиться по ssh к этому имени хоста, используя то же имя пользователя и учетные данные, которые я использовал для узла входа. Вот конфиг, который у меня получился:

Host jump-server
  HostName loginnode
  User user

Host remote
  User user
  IdentityFile C:\Users\user\.ssh\id_rsa
  ForwardX11 yes
  ForwardX11Trusted yes
  XAuthLocation /usr/bin/xauth
  ProxyCommand ssh -q jump-server "ssh user@`command_to_get_the_hostname` bash -l" 

Я пытаюсь подключиться по ssh с помощью этой команды: ssh.exe -v remote

И я получаю такой вывод:

OpenSSH_for_Windows_8.1p1, LibreSSL 3.0.2
debug1: Reading configuration data C:\\Users\\user/.ssh/config
debug1: C:\\Users\\user/.ssh/config line 14: Applying options for remote
debug1: Executing proxy command: exec ssh -q jump-server "ssh lemoni15@`command_to_get_the_hostname` bash -l"
debug1: identity file C:\\Users\\user\\.ssh\\id_rsa type 0
debug1: identity file C:\\Users\\user\\.ssh\\id_rsa-cert type -1
debug1: Local version string SSH-2.0-OpenSSH_for_Windows_8.1
: command not foundSH_for_Windows_8.1

решение1

RemoteCommand

Вы сказали, что только хост перехода знает имя хоста удаленного хоста, верно? Запускается ProxyCommandна локальной машине, поэтому он никогда не запустится command_to_get_the_hostnameна хосте перехода. Чтобы сначала подключиться к хосту перехода, а затем запустить команду там, вы можете использовать RemoteCommandвместо этого.

RemoteCommand

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

Например

Host remote
  Hostname jump-host.example.com
  User user
  RemoteCommand ssh user@$(/full/path/to/command_to_get_the_hostname)

Теперь вы можете подключиться к удаленному хосту, используя ssh -t remote, где-t принудительное псевдотерминальное распределениедля запуска $(command)на удаленной стороне, т.е. на хосте перехода.

В качестве побочного эффекта вы не сможете использовать локальный ключ IdentityFile C:\Users\user\.ssh\id_rsaдля удаленного хоста, но у хоста перехода должен быть ключ, поскольку второй sshтеперь запущен на хосте перехода.

ProxyJumpи написание сценариев

Если вы хотите использовать хост перехода как ProxyJump( -J) хост, имея возможность использовать локальные IdentityFile( -i), ForwardX11( -X), ForwardX11Trusted( -Y) и т. д., потребуется написать скрипт вместо использования только файла конфигурации SSH. Сначала вам нужно будет подключиться к хосту перехода, получить оттуда адрес удаленного хоста, а затем использовать его в другом соединении SSH.

СБашэто будет что-то вроде:

#!/bin/bash

remotehost=$(\
  ssh [email protected] \
  /full/path/to/command_to_get_the_hostname) || exit 1

ssh -X -Y -J [email protected] \
  -i ~/.ssh/id_rsa user@"$remotehost"

ядуматьэто можно было бы превратить вPowerShellСкрипт на Windows (не тестировал):

$remoteHost = ssh.exe [email protected] `
  /full/path/to/command_to_get_the_hostname
if (-not $?) {throw "Failed to get the remote hostname"}

ssh.exe -X -Y -J [email protected] `
  -i "C:\Users\user\.ssh\id_rsa" "user@$remoteHost"

Связанный контент