Linux 命令行实用程序首先使用 /etc/hosts 解析主机名

Zul*_*lan 44 domain-name-system linux hostname

有几个命令行实用程序可以解析主机名(host, dig, nslookup),但是它们都专门使用名称服务器,而应用程序通常/etc/hosts首先查看(我相信使用 gethostbyname )。

是否有命令行实用程序来解析行为类似于普通应用程序的主机名,从而/etc/hosts首先查看,然后才询问名称服务器?

(我知道它可能像 3 行 c,但我需要在一个有点便携的 shell 脚本中使用它。)

wom*_*ble 62

这很容易实现getent

getent hosts 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

getent将对中配置的任何类型的数据进行查找nsswitch.conf

  • 对于那些有兴趣阅读更多关于“getent”意图的人:https://www.computerworld.com/article/2812084/getting-an-entry-with-getent.html (2认同)

Zor*_*che 29

一种可行的工具是getent. 所以你可以使用getent hosts www.google.com, 或getent hosts localhost。它将从您的名称服务切换配置中指定的数据库中检索条目/etc/nsswitch.conf

对于更现代的实现,使用getent ahosts www.google.com这将获得多个结果。


Mir*_*ici 9

您可以使用 gethostbyname() (已弃用)包装器,例如:

python -c 'import socket;print socket.gethostbyname("www.google.com")'
Run Code Online (Sandbox Code Playgroud)

或 getaddrinfo() 包装器,如:

python -c 'import socket;print socket.getaddrinfo("www.google.com","http")[0][4][0]'
Run Code Online (Sandbox Code Playgroud)

对于python3:

python -c 'import socket;print(socket.getaddrinfo("www.google.com","http")[0][4][0])'
Run Code Online (Sandbox Code Playgroud)

请注意,getaddrinfo 会将所有实例作为列表返回。命令的最后一部分只选择第一个元组。这也可以返回 IPv6 地址。


vin*_*c17 9

使用getent ahosts,例如:

$ getent ahosts www.google.com | sed -n 's/ *STREAM.*//p'
216.58.210.196
2a00:1450:4006:803::2004
Run Code Online (Sandbox Code Playgroud)

您将通过 glibc 解析器获得所有 IPv4 和 IPv6 地址(因此/etc/hosts首先使用,通常在 中配置/etc/nsswitch.conf)。

不要使用getent hosts,因为它会为您提供 IPv6 或 IPv4 地址(不能同时提供),并且所选协议可能不是不起作用的协议。实际上,通常首选 IPv6 地址,但在某些地方,路由器会过滤(不支持)IPv6 数据。


cjc*_*cjc 6

resolveip 会这样做。

奇怪的是,它是 RHEL 和 Ubuntu 上 mysql-server 软件包的一部分。


Kyl*_*ith 6

您可以使用 [您最喜欢的语言] 来编写一个调用getnameinfo的脚本。这就是二进制文件(如 ping)应该这样做的方式,因此您可以确保获得相同的待遇。


Pau*_*l M 6

你可能真的很黑客并使用arp

arp -n somehostname | tr -d '()' | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)

但这真的很难看,所以你不应该这样做。