我在 shell 中,想知道主机名对应的 IP 地址。
我知道我可以通过 Perl、PHP、Python 或许多其他脚本语言(甚至可能是 awk!)来获得它,这将是我的解决方法,但令我惊讶的是似乎没有命令行工具可以做到这一点,没有简单的包装器getaddrinfo()
。
我错了吗?有吗?host
,dig
和getent
不算,我想要一些使用 libc 并按照 操作的东西/etc/nsswitch.conf
,以及可能默认安装在任何 (linux) 系统上的东西。
答案:我错了,getent
并不是专门查找/etc/hosts
,它实际上进行了适当的查找。
答案1
执行主机名查找的传统工具是 bind 的 nslookup,但是它正在被 dig 取代。这两种工具都是 DNS 特定的,并且不使用 nsswitch。getent hosts 使用 nsswitch,但是很少使用。
答案2
getent
无疑是适合这项工作的工具,但不幸的是它并不是到处都可以使用的,原因之一是它不是强制性的,因为 POSIX 未对其进行定义。
另一方面,虽然标准中没有指定,但arp
不太可能在任何执行名称解析的服务器上都不可用。 如下arp
设置nsswitch.conf
,仅使用libc
,可在任何 Linux/Unix 系统上使用,并提供在实现之间似乎一致的输出,解析其输出即可完成工作:
$ arp stackoverflow.com | sed -e 's/.*(//' -e 's/).*$//'
198.252.206.16
下面是一个使用该方法的 shell 函数,避免了 Linux arp 在某些特殊情况下切换到不同输出格式的问题:
resolve()
{
: ${1:?Usage: resolve name}
(
PATH=$PATH:/usr/sbin
ao=$(arp $1)
[ "$(echo "$ao"|grep HWaddress)" ] && ao=$(arp -a $1)
echo "$ao" | sed -e 's/.*(//' -e 's/).*$//'
)
}