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_hostname
no 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_rsa
para o host remoto, mas o host de salto deve ter a chave, pois o segundo ssh
agora está sendo executado no host de salto.
ProxyJump
e 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"