如何设置 SSH 配置以获取 ssh 主机名的一部分并用作变量?

如何设置 SSH 配置以获取 ssh 主机名的一部分并用作变量?

我正在通过 SSH 连接多个设置相同的数据中心。每个数据中心都有一个跳转箱,后面可以访问各种数据库服务器等。

当这些服务器在数据中心之间几乎相同(除了跳转箱 IP)时,手动指定所有这些服务器的条目是一件很麻烦的事。因此,我想设置我的.ssh/config文件,以便我可以键入datacenter_name-server_behind_jumpbox并让 SSH 从主机前端抓取datacenter_name(以便我可以在 中重复使用它)ProxyCommand

例如,如果我想访问 datacenter1 中的 Maria 服务器,我会为名为 的 jumpbox 创建一个名为 的 SSH 条目datacenter1。然后对于它后面的 Maria 服务器,我会设置类似以下内容:

Host %dc%-maria
    Hostname maria
    User jeff
    ProxyCommand ssh -q -W %h:%p %dc

这样,我只需要为位于跳转箱后面的每种类型的服务器设置一个条目,它就会自动知道要访问哪个数据中心跳转箱。

这样的事可能吗?

答案1

我在主机名中添加了一个假后缀,其中包含不同的代理主机

Host *.dc1
    ProxyCommand ssh -q %r@dc1 -W %h:%p

Host *.dc2
    ProxyCommand ssh -q %r@dc2 -W %h:%p

然后执行类似 ssh server1.dc1 的操作,它将使用代理主机。

您可以添加自定义设置的主机条目,如下所示:

Host server1.*
    User jeff

答案2

您可以将脚本作为自定义 ProxyCommand 运行,并在真实的代理命令:

.ssh/config

Host *-maria
    Hostname maria
    User jeff          
    ProxyCommand /bin/datacenter_ssh.sh %h %p

datacenter_ssh.sh

#!/bin/bash
COMBINED=$1
DATACENTER=$(echo $COMBINED | cut -d'-' -f1)
SERVER=$(echo $COMBINED | cut -d'-' -f2)
PORT=$2

ssh -q -W $SERVER:$PORT $DATACENTER

答案3

我处于类似的情况并且做着这样的事情:

# configuration for the datacenter, can add entries for each datacenter
Host datacenter_name
    HostName <datacenter_ip>
    User <datacenter_user>
    IdentityFile <datacenter_keyfile>

# usage match: datacenter_name-server_behind_jumpbox
Host *-*
    User <server_behind_jumpbox user>
    IdentityFile <server_behind_jumpbox keyfile>
    Port <server_behind_jumpbox port>
    ProxyCommand ssh $(echo %h | cut -d- -f1) nc $(echo %h | cut -d- -f2) %p"

当然你也可以做更多像你描述的那样的事情

# usage match: datacenter_name-maria, specify one for each server
Host *-maria
    User <maria user>
    IdentityFile <maria keyfile>
    Port <maria port>
    ProxyCommand ssh $(echo %h | cut -d- -f1) nc $(echo %h | cut -d- -f2) %p"

相关内容