我有两个平台和许多服务器,我想通过 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 变量来扩展
$e
我example.org
不经常访问的内容。其他变量~/.ssh/config
以简短名称列出。你可以像这样使用它:ssh www.$e
有了这个,您就可以使用标准
~/.ssh/config
方法。另一个选择:为 ssh 编写一个小的包装脚本或 shell 函数,捕获主机名并扩展它,如下所示:
#!/bin/bash hn=`host $1 | cut -d ' ' -f 1` ssh $hn
如果用 调用它
sshwrapper.sh www
,它将扩展www
为www.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 测试的内容(您的测试显然会被定制)