如何使用跳转服务器提供的可变主机名设置 SSH 连接

如何使用跳转服务器提供的可变主机名设置 SSH 连接

我想创建一个 .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

指定成功连接到服务器后在远程计算机上执行的命令。命令字符串延伸到行尾,并使用用户的 shell 执行。- -

例如

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"

思考这可以变成一个电源外壳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"

相关内容