![Как настроить SSH-соединение, используя переменное имя хоста, предоставленное сервером jump](https://rvso.com/image/789293/%D0%9A%D0%B0%D0%BA%20%D0%BD%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B8%D1%82%D1%8C%20SSH-%D1%81%D0%BE%D0%B5%D0%B4%D0%B8%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D1%83%D1%8F%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5%20%D0%B8%D0%BC%D1%8F%20%D1%85%D0%BE%D1%81%D1%82%D0%B0%2C%20%D0%BF%D1%80%D0%B5%D0%B4%D0%BE%D1%81%D1%82%D0%B0%D0%B2%D0%BB%D0%B5%D0%BD%D0%BD%D0%BE%D0%B5%20%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%BE%D0%BC%20jump.png)
Я хочу создать файл .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"