![host 能够解析主机名,而 ssh 不能](https://linux22.com/image/1038683/host%20%E8%83%BD%E5%A4%9F%E8%A7%A3%E6%9E%90%E4%B8%BB%E6%9C%BA%E5%90%8D%EF%BC%8C%E8%80%8C%20ssh%20%E4%B8%8D%E8%83%BD.png)
我尝试通过 SSH 从 10.04 系统连接到 12.04 系统。奇怪的是,规则似乎resolv.conf
只选择性地生效,这让我很困惑。观察:
[2] user@mach:~$ ssh pangolin
ssh: Could not resolve hostname pangolin: Name or service not known
[2] user@mach:~$ host pangolin
pangolin.subdomain.domain.tld has address 172.16.7.12
subdomain.domain.tld
在行search
中/etc/resolv.conf
,并且host
根据这些规则正确搜索名称。但是,使用 SSH 客户端时,ssh
我收到上面重现的错误。这怎么可能?我一直认为中的名称解析规则resolv.conf
适用于系统全局。
注意:根本/etc/hosts
没有声明名称。该包是在目标机器上配置的。问题纯粹是关于为什么这两个程序之间的名称解析不一致。pangolin
openssh-server
另请注意:当我输入完全限定域名(即)时,该命令工作正常pangolin.subdomain.domain.tld
。
同时我重启了客户端机器(10.04),问题仍然存在。DNS缓存守护进程没有安装,所以我认为这应该不是问题。
评论中要求的信息:
$ grep host /etc/nsswitch.conf
hosts: files dns
/etc/resolv.conf
之后,我不断变换域名:
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 172.16.1.1
nameserver 172.16.1.5
search subdomain.domain1.com domain1.com domain2 domain3.com domain2.ccTLD domain3.net dev.domain1.com sdk.dev.domain1.com
... 完整内容/etc/nsswitch.conf
:
$ cat /etc/nsswitch.conf
# /etc/nsswitch.conf
#
# Example configuration of GNU Name Service Switch functionality.
# If you have the `glibc-doc-reference' and `info' packages installed, try:
# `info libc "Name Service Switch"' for information about this file.
passwd: compat
group: compat
shadow: compat
hosts: files dns
networks: files
protocols: db files
services: db files
ethers: db files
rpc: db files
netgroup: nis
...和,这是12.04中/etc/network/interfaces
的来源:resolv.conf
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
auto eth0
iface eth0 inet static
address 172.16.1.234
netmask 255.255.0.0
gateway 172.16.255.254
dns-nameservers 172.16.1.1 172.16.1.5
dns-search domain1.com. domain2. domain3.com. domain2.ccTLD. domain3.net. dev.domain1.com. sdk.dev.domain1.com. subdomain.domain1.com.
dns-domain subdomain.domain1.com.
注意:域名的转换是用 完成的sed
,因此在各个复制文件之间是一致的。
没有~/.ssh/config
,但这里有一个全局的(/etc/ssh/ssh_config
),为了简洁起见,它缩小了:
$ grep -v '^#' /etc/ssh/ssh_config |grep -v '^[[:space:]]*$'
Host *
SendEnv LANG LC_*
HashKnownHosts yes
GSSAPIAuthentication yes
GSSAPIDelegateCredentials no
$ mtr pangolin
Name or service not known: Success
答案1
而ssh
其他程序(例如ping
使用 glibc 解析器查找主机名(本例中为“pangolin”))则host
直接在 DNS 中查找名称,绕过 glibc 解析器。这就是区别。
然而,考虑到您的机器上的 glibc 解析器配置为dns
在 之后尝试files
,我无法解释为什么解析器在host
成功的地方失败。
要尝试使用 glibc 解析器,可以使用getent hosts ...
代替host ...
。
我以前在使用 dnsmasq 作为本地转发名称服务器时曾见过这种行为报告(https://bugs.launchpad.net/ubuntu/+source/dnsmasq/+bug/998712),但您没有使用这样的本地名称服务器;但也许那里的问题不是出在 dnsmasq 中,而是出在 glibc 解析器中。
答案2
您的 ssh 可能会尝试解析 IP6 并超时。如果您不使用 IP6,请尝试/etc/ssh/ssh_config
通过将 AddressFamily 从 更改为any
来禁用 IP6 inet
。
答案3
我偶然将域名输入行放在 2 个名称服务器行之前,从而出现此错误。nslookup 有效。wget 有效。ssh、scp、rsync 失败。
将域名移至以下名称服务器并保存已修复的 resolv.conf。对我来说不需要再做其他事情了。
答案4
我知道这是一个古老的问题,但我会补充一些对我有用的内容。
我遇到了同样的问题,发现在我的 中nsswitch.conf
,mdns
除了 和 之外files
还有dns
。删除后,mdns4
这个问题就解决了。