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。
Zor*_*che 29
一种可行的工具是getent. 所以你可以使用getent hosts www.google.com, 或getent hosts localhost。它将从您的名称服务切换配置中指定的数据库中检索条目/etc/nsswitch.conf。
对于更现代的实现,使用getent ahosts www.google.com这将获得多个结果。
您可以使用 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 地址。
使用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 数据。
你可能真的很黑客并使用arp:
arp -n somehostname | tr -d '()' | awk '{print $2}'
Run Code Online (Sandbox Code Playgroud)
但这真的很难看,所以你不应该这样做。