是否有一个标准的命令行工具来执行主机名查找?

是否有一个标准的命令行工具来执行主机名查找?

我在 shell 中,想知道主机名对应的 IP 地址。

我知道我可以通过 Perl、PHP、Python 或许多其他脚本语言(甚至可能是 awk!)来获得它,这将是我的解决方法,但令我惊讶的是似乎没有命令行工具可以做到这一点,没有简单的包装器getaddrinfo()

我错了吗?有吗?hostdiggetent不算,我想要一些使用 libc 并按照 操作的东西/etc/nsswitch.conf,以及可能默认安装在任何 (linux) 系统上的东西。

从这里移至https://stackoverflow.com/questions/20211326/is-there-a-standard-command-line-tool-to-do-a-hostname-lookup

答案:我错了,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/).*$//'
  )
}

相关内容