Como configurar uma conexão SSH usando um nome de host variável fornecido pelo servidor jump

Como configurar uma conexão SSH usando um nome de host variável fornecido pelo servidor jump

Quero criar um arquivo .sshconfig para o caso em que preciso me conectar a um nó de login (o servidor de salto), obter o nome do host desse nó executando um comando e, em seguida, fazer ssh para esse nome de host usando o mesmo nome de usuário e credenciais que eu usado para o nó de login. Esta é a configuração que acabei com:

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" 

Estou tentando fazer ssh usando este comando: ssh.exe -v remote

E estou recebendo esta saída:

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

Responder1

RemoteCommand

Você disse que apenas o host de salto conhece o nome do host do host remoto, certo? O ProxyCommandé executado na máquina local, portanto, nunca será executado command_to_get_the_hostnameno host de salto. Para primeiro conectar-se ao host de salto e depois executar o comando lá, você pode usar RemoteCommand.

RemoteCommand

Especifica um comando a ser executado na máquina remota após a conexão bem-sucedida ao servidor. A string de comando se estende até o final da linha e é executada com o shell do usuário. - -

Por exemplo

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

Agora você pode se conectar ao host remoto usando ssh -t remote, onde o-t força a alocação de pseudo-terminaispara executar o $(command)no lado remoto, ou seja, no host de salto.

Como efeito colateral, você não poderá usar o local IdentityFile C:\Users\user\.ssh\id_rsapara o host remoto, mas o host de salto deve ter a chave, pois o segundo sshagora está sendo executado no host de salto.

ProxyJumpe scripts

Se você quiser usar o host de salto como um host ProxyJump( -J), podendo usar o local IdentityFile( -i), ForwardX11( -X), ForwardX11Trusted( -Y) etc., alguns scripts serão necessários em vez de usar apenas o arquivo de configuração SSH. Primeiro, você precisaria se conectar ao host de salto, obter o endereço do host remoto de lá e usá-lo em outra conexão SSH.

ComBashisso seria algo como:

#!/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"

EUpensarisso poderia ser transformado em umPowerShellscript no Windows (não testei):

$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"

informação relacionada