通过 SSH 连接时尝试各种主机后缀

通过 SSH 连接时尝试各种主机后缀

通过 SSH 连接到主机时,我希望能够简单地键入即可ssh hostname连接。

但是,我们当前的设置意味着我必须输入相当长的后缀才能连接,类似于hostname.hosts.companyname.com.

是否可以将 SSH 设置为在放弃连接之前循环访问多个主机名,而不将它们添加到我的主机文件中?例如。如果我输入 ssh hostname,我希望 SSH 能够:

  1. hostname如果在短暂超时后失败,请尝试通过 SSH 访问:
  2. hostname.hosts.companyname.com如果在短暂超时后失败,请尝试通过 SSH 访问 :
  3. 尝试通过 SSH 连接到 hostname.companyname.com,如果失败,那么它应该打印错误。

然而,我们有超过 1000 个主机,我不想为所有主机添加别名。我希望这是默认行为。

上面是一个简短的例子。我希望能够将 30 个潜在域范围内的内容添加到此列表中,这就是为什么resolv.conf search这不是一个选项(因为它仅限于 6 个域)。

答案1

/etc/resolv.conf按照以下两个步骤更新您的 DNS :

  1. 可能有一条线domainsearch.如果有,则将文件中替换domainsearch,然后继续下一步。
  2. 追加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 函数向文件添加新Hostconfig并在运行之前检查文件ssh-keyscan

相关内容