有没有标准的命令行工具可以进行主机名查询?

3
我在shell中,想要知道主机名对应的IP地址(es)。
我知道可以通过Perl、PHP、Python或其他一些脚本语言(甚至awk!)来获取它,这将是我的解决方法,但我很惊讶似乎没有命令行工具可以做到这一点,没有简单的包装器围绕getaddrinfo()。
我错了吗?有吗? host和getent不算,我想要使用libc并根据/etc/nsswitch.conf执行操作的东西,并且可能默认安装在任何(Linux)系统上。 https://superuser.com/questions/681612/is-there-a-standard-command-line-tool-to-do-a-hostname-lookup的答案:getent hosts确实完全符合我的要求,而不仅仅是/etc/hosts查找。

转念一想,这个问题应该在超级用户或服务器故障上问。 - clacke
已移至http://superuser.com/questions/681612/is-there-a-standard-command-line-tool-to-do-a-hostname-lookup - clacke
重新发布同样的问题到另一个网站并不是移动问题的正确方式:http://meta.stackexchange.com/questions/85017/moving-my-own-question-to-another-stackexchange-site - jlliagre
谢谢。下次我会做的。 - clacke
5个回答

2

一种方法是利用 arp,它遵循 nsswitch.conf 设置,只使用 libc 并且在任何 Linux/Unix 系统上都可用,例如:

$ arp stackoverflow.com | sed -e 's/.*(//' -e 's/).*$//'
198.252.206.16

这是一个使用该方法的shell函数,同时解决了clacke报告的问题:
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/).*$//'
  )
}

在RHEL 6上,如果主机在arp表中实际上有可用的MAC地址,则“arp”会显示一个带有MAC地址和其他信息的表格,但不包括IP地址。您的示例不幸地不是本地物理网络地址,因此它们缺少这种情况。 - clacke
1
@clacke 我确实很不幸!回答已更新。 - jlliagre
不支持仅使用IPv6的域名。 - JK-Hu
很好,但是 sed 部分并不总是有效。 - RonJohn
@RonJohn在这种情况下,arp stackoverflow.com返回什么? - jlliagre
sed命令在stackoverflow.com上完美运行,该服务器除了arp之外从未使用过:具体来说是“stackexchange.com(151.101.65.69)-没有条目”。然而,在缓存中已经存在的服务器上执行arp会返回完全不同的结果。 - RonJohn

1
最简单的方法是使用resolveip命令。
#resolveip -s hostname

或者使用最常见的命令:ping。
#ping -c 1 hostname | cut -d " " -f 3 | egrep 1

1
yum provides *bin/resolveip mysql-server-5.1.66-2.el6_3.x86_64 : MySQL服务器及相关文件 在许多Linux系统中,默认情况下未安装MySQL。 - clacke

0
你可以使用 dig 命令:
$ dig stackoverflow.com
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> stackoverflow.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 45432
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;stackoverflow.com.             IN      A

;; ANSWER SECTION:
stackoverflow.com.      197     IN      A       198.252.206.16

;; Query time: 26 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Tue Nov 26 09:28:10 2013
;; MSG SIZE  rcvd: 51

正如您所看到的,只有一行没有以;开头,因此可以通过构建管道来使用grep获取IP地址:

$ dig stackoverflow.com | grep -e "^[^;]" | tr -s " \t" " " | cut -d" " -f5
198.252.206.16

1
它不会解析在/etc/hosts、ldap、nis以及其他在/etc/nsswitch.conf中定义的主机后端服务中定义的条目。 - jlliagre

0

nslookup怎么样?

$ nslookup stackoverflow.com
Server:     8.8.8.8
Address:    8.8.8.8#53

Non-authoritative answer:
Name:   stackoverflow.com
Address: 198.252.206.16

1
它不会解析在/etc/hostsldapnis以及其他在/etc/nsswitch.conf中定义的主机后端服务中定义的条目。 - jlliagre

0

如果你使用的是基于Debian的发行版:

sudo apt-get update
sudo apt-get install libsocket-getaddrinfo-perl
socket_getaddrinfo one.one.one.one

# Resolved host 'one.one.one.one', service '0'
# 
# socket(AF_INET , SOCK_STREAM, IPPROTO_TCP) + '1.1.1.1:0'
# socket(AF_INET , SOCK_DGRAM , IPPROTO_UDP) + '1.1.1.1:0'
# socket(AF_INET , SOCK_RAW   , IPPROTO_IP ) + '1.1.1.1:0'
# socket(AF_INET , SOCK_STREAM, IPPROTO_TCP) + '1.0.0.1:0'
# socket(AF_INET , SOCK_DGRAM , IPPROTO_UDP) + '1.0.0.1:0'
# socket(AF_INET , SOCK_RAW   , IPPROTO_IP ) + '1.0.0.1:0'
# socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP) + '[2606:4700:4700::1111]:0'
# socket(AF_INET6, SOCK_DGRAM , IPPROTO_UDP) + '[2606:4700:4700::1111]:0'
# socket(AF_INET6, SOCK_RAW   , IPPROTO_IP ) + '[2606:4700:4700::1111]:0'
# socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP) + '[2606:4700:4700::1001]:0'
# socket(AF_INET6, SOCK_DGRAM , IPPROTO_UDP) + '[2606:4700:4700::1001]:0'
# socket(AF_INET6, SOCK_RAW   , IPPROTO_IP ) + '[2606:4700:4700::1001]:0'

socket_getaddrinfo localhost

# Resolved host 'localhost', service '0'
# 
# socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP) + '[::1]:0'
# socket(AF_INET6, SOCK_DGRAM , IPPROTO_UDP) + '[::1]:0'
# socket(AF_INET6, SOCK_RAW   , IPPROTO_IP ) + '[::1]:0'
# socket(AF_INET , SOCK_STREAM, IPPROTO_TCP) + '127.0.0.1:0'
# socket(AF_INET , SOCK_DGRAM , IPPROTO_UDP) + '127.0.0.1:0'
# socket(AF_INET , SOCK_RAW   , IPPROTO_IP ) + '127.0.0.1:0'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接