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