每个 DNS 域的 ssh 配置

每个 DNS 域的 ssh 配置

我有两个平台和许多服务器,我想通过 ssh 连接它们。

我有 resolv.conf

search domain1.net domain2.org

所以我只需要输入 ssh 的机器名。

我希望每个域都有一个 ssh 配置

  • domain1.net 每台机器的用户管理员
  • domain2.org 每台机器的用户为 root

我怎样才能实现这一点?

主持人主机名指令似乎仅适用于您在 ssh 命令中输入的内容,而不适用于使用 DNS 后缀扩展的内容

答案1

我相信 OpenSSH 可以进行规范化。请查看 ssh_config 手册页中的以下选项:

  • 规范化主机名
  • CanonicalizeFallbackLocal
  • 规范化最大点数
  • 规范化允许的 CNAME
  • 主持人
  • canonical与选项匹配

请注意,这可能需要比您现有的 OpenSSH 版本更新的版本(我有 7.4p1)。

答案2

正如 kasperd 所说,这实际上是不可能的。

一些解决方法:

  • 我只是使用一些小的 shell 变量来扩展$eexample.org不经常访问的内容。其他变量~/.ssh/config以简短名称列出。你可以像这样使用它:

    ssh www.$e 
    

    有了这个,您就可以使用标准~/.ssh/config方法。

  • 另一个选择:为 ssh 编写一个小的包装脚本或 shell 函数,捕获主机名并扩展它,如下所示:

    #!/bin/bash
    hn=`host $1 | cut -d ' ' -f 1`
    ssh $hn 
    

    如果用 调用它sshwrapper.sh www,它将扩展wwwwww.example.org并将其用于ssh

答案3

支持@sven 所说的,一个小小的 bash 函数可以做同样的事情:

ssh() {
    declare h=$(host $1 | head -n 1 | cut -d ' ' -f 1)
    command ssh $h
}

将其放在某个源文件中,例如 .profile,它总是根据 /etc/resolv.conf 中的搜索顺序修复名称

答案4

另一种对其他人来说可能有用的方法是利用(相对)新的 ssh_config 功能,该功能允许包含文件,甚至包含也可以是有条件的。

我只想分享一个来自我的配置的混淆示例,用于测试如果

  • 我的手机已通过 USB 连接
  • 我没有其他网络连接(我没有默认路由)

然后它将包含另一个文件,该文件通过我的手机路由一些 ssh 内容

Match exec "[ -e /dev/serial/by-id/usb-SAMSUNG_SAMSUNG_Android_XXXXXXXX-if01 ] && ! ip route| grep -q ^default"
    Include blahblah_termux.ssh

您应该能够拥有 ~/.ssh/domain1.ssh 和 ~/.ssh/domain2.ssh 并包含基于 Match 测试的内容(您的测试显然会被定制)

相关内容