我们在公司网络上有一台名为 serverA 的服务器,如果我输入ssh serverA
,它会将我的 PC 连接到该服务器,即使我的 中没有该服务器的条目/etc/hosts
,但我曾经有另一台 PC,我必须在其中设置手动进行此操作/etc/hosts
。那么,ssh 如何发现网络上的主机名,以及如何确保它有效? (我提到的这两台机器都运行 Kubuntu Linux,较旧的一台运行 12.10,较新的一台运行 13.04。)
我有以下内容/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 127.0.1.1
search mycompany.com
监听端口53的进程:
sudo ss -ulnp | grep 53
#UNCONN 0 0 *:5353 *:* users:(("avahi-daemon",937,12))
#UNCONN 0 0 127.0.1.1:53 *:* users:(("dnsmasq",1781,4))
#UNCONN 0 0 :::5353 :::* users:(("avahi-daemon",937,13))
答案1
OpenSSH客户端使用标准域名系统操作系统提供的解析器,用于将主机名解析为 IP 地址。
配置hosts
在/etc/nsswitch.conf
配置解析主机时应查看的内容以及按什么顺序。
dns
通常大多数查找将由配置的解析器完成/etc/resolv.conf
。您可能需要联系管理员nameserver
,/etc/resolv.conf
并要求他们为您配置主机名/IP,在您的情况下,127.0.1.1 似乎就是您自己。如果您有动态 DHCP IP 地址,则这可能无法实现,具体取决于您的设置。
如果mdns
或多播 DNS 是启用您的工作主机的原因,则您的新主机可能位于不同的子网上或不广播其名称。
答案2
当服务器位于您配置的 DNS 搜索域内时,就会发生这种情况。
例如,我当前的搜索域是 example.com:
$ grep ^search /etc/resolv.conf
search example.com
我现在可以透明地执行以下操作:
$ ping foo.example.com
PING foo.example.com (127.0.0.1) 56(84) bytes of data.
^C
$ ping foo
PING foo.example.com (127.0.0.1) 56(84) bytes of data.
^C
搜索域允许在计算机名称和完全限定域名 (FQDN) 之间进行自动转换。