为什么 SSH 不解析这个主机名?

jld*_*ger 18 domain-name-system ssh

当我尝试通过 SSH 连接到名为 的网络上的主机时storage,出现 DNS 解析失败:

$ ssh storage
ssh: Could not resolve hostname storage: Name or service not known
Run Code Online (Sandbox Code Playgroud)

但是当我用主机查询 DNS 时,它可以工作

$ host storage
storage has address 192.168.20.103
Run Code Online (Sandbox Code Playgroud)

它是如何host能找到IP,但ssh不能?

小智 35

sshhost按照完全不同的路径解析名称,因此有时它们会产生不同的结果也就不足为奇了,尤其是当要解析的名称不是 FQDN 时(因此建议在任何地方使用 FQDN。)

您没有提及有关您的操作系统和系统配置的任何内容,所以我必须保持笼统,关注 Linux:MacOS 的细节有些不同,Windows 的细节有所不同,但一般概念是相同的。

  • host查询 DNS,因此基本上它会查找/etc/resolv.conf并查询那里列出的服务器,如果主机名尚未完全限定,则可能会附加域名。它会忽略所有其他可能的来源,但请注意,如今许多系统运行本地缓存 DNS 服务器(通常dnsmasq),该/etc/hosts服务器在查询其他 DNS 服务器之前读取和其他来源,因此如果host查询该本地服务器,结果/etc/hosts可能会蔓延。

  • ssh走自己的路。我将描述opensshLinux 下的功能,其他实现有所不同。首先,它查找配置文件(系统范围和每个用户)中定义的主机昵称,然后按照. 说它是这样的:/etc/ssh/ssh_config~/.ssh/confighosts:/etc/nsswitch.conf

    hosts: files dns
    
    Run Code Online (Sandbox Code Playgroud)

    这意味着:查看/etc/hosts然后查询 DNS(/etc/resolv.conf再次)。其他可能的来源是过时的nisnetinfo服务、LDAP、活动目录,您可以命名它们。

要调试您的特定情况,您应该遵循您的实现路径ssh并找出它卡住的地方。

  • ltrace/strace 可以给你提示 ssh 实际上是如何尝试解析域的……而最接近操作系统的方法,命令行 dns 工具可能是 getent。 (6认同)