我有一个具有 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 帮助程序脚本相结合。
- 将这样的部分添加到〜/ .ssh /配置— 您想要重新映射的每个域一个:
Match final host="!*.corp.foo.com,*.foo.com"
ProxyCommand ssh_ext2int %h %p
Match final host="*.quux.biz"
ProxyCommand ssh_ext2int %h %p
- 将其保存在您的
$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,它将包含所有主机的完整硬编码项。它不一定是主配置文件,而只是一些包含的配置文件。配置文件实际上只是一个文本文件。