有没有办法让 ssh 通过外部 API 动态查找给定主机名的 ip 地址?
场景是,我有几个客户,他们拥有数千个不同的按需云服务器(每小时都会添加新的服务器,每小时都会关闭旧的服务器)。
由于名称太多并且变化很快,使用云服务 DNS API 并不是一个真正的选择(我之前尝试过,杀死了他们的管理面板和 API 服务器)。
所以...我在 ssh 中寻找一个配置选项,以便在执行“ssh some-name”时使用脚本查找 IP 地址。我知道我可以为 ssh 脚本设置别名并包装它,但我想知道是否有任何可用的内部选项。
答案1
有多种选择。主要是ProxyCommand
,它可以使用任意程序代替 TCP 连接 - 只要它在 stdin/stdout 中使用 SSH。(当然它只适用于 SSH。)
例如,通过另一个 SSH 服务器建立隧道:
ssh -o ProxyCommand="ssh bastion.tld -W %h:%p" server123.tld
因此,您可以用您喜欢的语言编写一个工具/脚本,它接受命令行中的主机名,查找服务器,打开 TCP 连接,并在它和 stdin/out 之间复制数据。(它可以是一个运行的 shellscript nc
。)
然后像这样使用它:
# ~/.ssh/config – see `man ssh_config`
Host *.example.com
ProxyCommand ~/bin/ssh-cloud-lookup %h %p
第二种选择是编写一个自定义 DNS 服务器,使用容器 API 来查找地址并提供响应。我相信我见过一些工具(如 Chubby)就是这样做的。
第三个选项(特定于 Linux)是编写一个“nsswitch”插件来实现主机名查找,类似于现有的“dns”、“mdns”、“files”插件。例如,systemd 附带一个名为的插件,nss_mymachines
用于解析 nspawn 容器的名称。