如何配置 ~/.ssh/config 以便 `ssh foo.bar` 导致与 `foo.internal.bar` 的连接?

如何配置 ~/.ssh/config 以便 `ssh foo.bar` 导致与 `foo.internal.bar` 的连接?

我有一个具有 public 的系统(例如 server1.foo.bar)并且可私有解析(例如 server1.内部.foo.bar) DNS 名称。 SSH 连接只能通过私有 IP 进行,但我总是根据这些主机的公共名称来考虑这些主机。

我想:

  • 连接到正确的 IP,无论我是否记得使用该*.internal.bar模式
  • 保存击键次数

我知道替代标记例如%h可用于修改命令行给出的主机名,例如

Host foo
    Hostname %h.some.other.domain

我正在寻找的行为类似于:

Host *.foo.bar
    Hostname %m.internal.foo.bar

其中%m仅替换为给定主机名的部分直到第一个点。我man 5 ssh_config也读过https://man.openbsd.org/ssh_config并且找不到答案(如果存在的话)。我使用的是 macOS 10.15.4:

$ ssh -V
OpenSSH_8.1p1, LibreSSL 2.7.3

答案1

我想出了一个工作方法。它有点难看,但确实有效。这利用了ProxyCommand指令(参见联机帮助页)与一个小的 bash 帮助程序脚本相结合。

  1. 将这样的部分添加到〜/ .ssh /配置— 您想要重新映射的每个域一个:
Match final host="!*.corp.foo.com,*.foo.com"
    ProxyCommand ssh_ext2int %h %p

Match final host="*.quux.biz"
    ProxyCommand ssh_ext2int %h %p
  1. 将其保存在您的$PATH某处ssh_ext2int——还有chmod u+x它:
#!/usr/bin/env bash

[ $# -eq 2 ] || exit 1
typeset -A dmap
dmap=(
  [foo.com]=corp.foo.com
  [quux.biz]=internal.qux.lan
)

d=${1#*.}
h=${1%%.*}
nd=${dmap[$d]:-$d}

/usr/bin/nc -w 120 $h.$nd $2 2>/dev/null

现在,ssh server158247.quux.biz应该将您连接到server158247.internal.qux.lan

答案2

您所要求的这个特定的事情对于 OpenSSH 来说是不可能的。这些构造实际上仅适用于简单的别名,而不适用于您要求的复杂替换。如果这些服务器有某种特定的格式,您可以将它们设为别名(不带域名):

Host server*
    Hostname %h.internal.foo.bar

如果您需要一些更复杂的别名匹配(假设您有一个包含所有主机的文件。这可以手动创建或从 DNS 自动更新),您可以使用类似的东西

Match exec "grep %h %d/.ssh/internal_hosts"
    Hostname %h.internal.foo.bar

最后的手段是从上面的列表/DNS 生成 ssh_config,它将包含所有主机的完整硬编码项。它不一定是主配置文件,而只是一些包含的配置文件。配置文件实际上只是一个文本文件。

相关内容