UNIX 计算机如何通过主机名找到彼此?

UNIX 计算机如何通过主机名找到彼此?

我有一个家庭网络,其中有几台安装了 samba 的 Windows 和 Linux 机器。

在 Windows 上,我可以通过主机名很好地找到每台计算机。

然而,在 Linux 计算机上,我无法通过主机名找到任何其他计算机——只有 IP 地址有效。

事实上,Linux似乎连自己都无法解决:

user@atom:~$ host atom
Host atom not found: 3(NXDOMAIN)

答案1

Windows 使用不同的系统来解析 Linux 的主机名。

Linux 使用/etc/hosts文件和/或 DNS 进行名称解析

/etc/hosts文件只是 IP 地址和名称的列表,在意识到它变得太大而难以管理之前,它曾经是将名称映射到 IP 地址的唯一方法。解决方案是 DNS(域名系统),这是一个分布式数据库,现在支撑着整个互联网。

host您使用的命令仅查询 DNS - 而不是,/etc/hosts因此它无法找到您的本地计算机,除非它有 DNS 条目。

要按名称访问所有 Linux 计算机,请创建一个/etc/hosts文件:

127.0.0.1    localhost.localdomain    localhost
192.168.0.5  laptop.mydomain.net  laptop
192.168.0.6  server.mydomain.net  server
192.168.0.7  printer.mydomain.net printer

并将其分发到您所有的 Linux 计算机,或者安装 DNS。dnsmasq是一个轻量级的 DNS/DHCP 服务器,非常适合小型网络。

Windows使用它自己的NetBIOS 名称解析每台计算机在局域网上广播一条特殊消息,以便找出具有特定名称的计算机的 IP 地址。这就是为什么 Windows 计算机在同一网络上时往往会自动找到彼此。他们将其缓存以供将来使用,这样网络上就不会出现太多的干扰。

此广播名称解析的替代方案(对于较大的部署)是 WINS(Windows Internet 命名服务)这是计算机和/或服务名称到 IP 地址的中央数据库。现代版本的 Windows 现在使用 DNS,因为它是名称解析的事实上的标准,并且比 WINS 更具可扩展性。

答案2

Windows 计算机通过使用 NetBIOS 来查找对方。基本上网络上的所有节点都会选举一台计算机来负责名称解析,新的节点只能查询该节点。

host如果您没有设置 DNS 服务器,您的命令应该会失败。这相当于nslookupWindows 上的情况。如果您nslookup在一台 Windows 计算机上运行到另一台 Windows 计算机,如果没有 DNS,它也会失败,因为这是您使用所选命令查询的内容。

也就是说,您应该能够通过 IP 地址引用其他计算机,或者将它们的 IP 地址添加到/etc/hosts. IIRC Gnome 有一些 Samba 集成选项,允许您导航 SMB 工作组,类似于您可能想到的 Windows 工作组。不过,我一时想不起这个包裹的名字。

答案3

如果您家里没有 DNS 服务器(这不太可能),那么似乎有几个选择。

  1. 阅读 avahi-server(参见这个线程)看看这是否能解决您的问题。请注意有关将“.local”附加到主机名的注释。顺便问一下,当您在命令提示符下键入“主机名”时,您会得到什么?我还建议阅读主机名的联机帮助页,尤其是。关于 FQDN 的部分。
  2. 编辑/etc/hosts

编辑:根据评论者的要求,这是我链接的线程中的一些详细信息。您可以在 Linux 计算机中实施 Zeroconf,以通过本地网络公布其主机名。典型的安装(对于 ubuntu)是“sudo apt-get install avahi-daemon”。 Avahi 在 ubuntu 和其他 Linux 上实现了 Zeroconf,您只需要安装守护进程来通告主机名。我在这里读到另一个线程(https://superuser.com/questions/491747/how-can-i-resolve-local-addresses-in-windows)Bonjour(Apple 的一个 Zeroconf 实现)可以安装在 Windows PC 上以执行相同的功能。

相关内容