通过 SSH 连接到主机时,我希望能够简单地键入即可ssh hostname
连接。
但是,我们当前的设置意味着我必须输入相当长的后缀才能连接,类似于hostname.hosts.companyname.com
.
是否可以将 SSH 设置为在放弃连接之前循环访问多个主机名,而不将它们添加到我的主机文件中?例如。如果我输入
ssh hostname
,我希望 SSH 能够:
hostname
如果在短暂超时后失败,请尝试通过 SSH 访问:hostname.hosts.companyname.com
如果在短暂超时后失败,请尝试通过 SSH 访问 :- 尝试通过 SSH 连接到
hostname.companyname.com
,如果失败,那么它应该打印错误。
然而,我们有超过 1000 个主机,我不想为所有主机添加别名。我希望这是默认行为。
上面是一个简短的例子。我希望能够将 30 个潜在域范围内的内容添加到此列表中,这就是为什么resolv.conf
search
这不是一个选项(因为它仅限于 6 个域)。
答案1
/etc/resolv.conf
按照以下两个步骤更新您的 DNS :
- 可能有一条线
domain
或search
.如果有,则将文件中替换domain
为search
,然后继续下一步。 - 追加
hosts.companyname.com companyname.com
到搜索列表。如果没有search
(或domain
) 指令,请使用这两个值创建一个。
结果示例
nameserver 192.168.1.254
nameserver 192.168.2.254
search hosts.companyname.com companyname.com
/etc/hosts
这将允许根据您的标准通过 DNS 解析不合格的名称。
答案2
至少有两个选择:
配置文件
您生成一个~/.ssh/config
带有别名的文件:
Host hostname
HostName hostname.hosts.companyname.com
假设正确的主机名是静态的。当然,这在某种程度上类似于更改文件/etc/hosts
。
外壳函数
您可以为命令名称ssh
或必须显式调用的内容定义一个 shell 函数,例如ssh-hosts
.
ssh () {
hostname="$1"
test -z "$hostname" && return 128
for suffix in "" .hosts.companyname.com .companyname.com ; do
test_hostname="$hostname$suffix"
if [ -n "$(ssh-keyscan "$test_hostname" 2>/dev/null)"; then
ssh "$test_hostname"
return $?
fi
done
}
当然,您config
也可以使用这种方法来生成文件。如果您没有所有主机名的列表,那么您甚至可以使用 shell 函数向文件添加新Host
块config
并在运行之前检查文件ssh-keyscan
。