从主机名获取IP地址的最简单方法是什么?
我正在考虑尝试一个ping
,并从输出parsing它。 但是,这似乎不是很好,并可能不会在所有系统上以相同的方式工作。
我search了一下,发现了nslookup
解决scheme,但是这对于/etc/hosts
名不起作用。
你可以用标准的系统调用来做到这一点。 下面是Perl中的一个例子:
use strict; use warnings; use Socket; use Data::Dumper; my @addresses = gethostbyname('google.com'); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips);
产生输出:
$VAR1 = [ '74.125.127.104', '74.125.127.103', '74.125.127.105', '74.125.127.106', '74.125.127.147', '74.125.127.99' ];
(在命令行中,相同的脚本可以写成: perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print Dumper(\@ips)'
)
您可以在其他语言中同样做到这一点 – 请参阅man -s3 gethostbyname
等系统调用的手册页。
host <hostname>
例如:
serv ~ $ host stackoverflow.com stackoverflow.com has address 69.59.196.211
在Linux上(至less是一些OS X版本),你可以使用resolveip
,它是MySQL服务器包的一部分:
/etc/hosts: ... 127.0.0.1 localhost localhost.localdomain foo ... serv ~ $ resolveip foo IP address of foo is 127.0.0.1
这个古老的post似乎有很多创意解决scheme。
如果我需要确保/etc/hosts
被访问,我倾向于使用
getent hosts somehost.com
至less如果`/etc/nsswitch.conf'被configuration为使用文件(就像通常那样),这是有效的。
对于IPv4,有一个标准的程序可以使用包含/ etc / hosts的parsing器来开箱即用:
host="localhost" ip="`gethostip -d "$host"`"
它是Debian的一部分,安装它:
apt-get install syslinux
对于除IPv4之外的其他协议(如IPv6),我目前还不知道类似的工具。 更新:正因为如此,我刚刚写了一个能解决IPv6的小工具:
https://github.com/hilbix/misc/blob/master/src/ipof.c
它被认为是一个快速和肮脏的shell使用像gethostip
但也允许IPv6:
ip="`ipof -6 -- heise.de`"
它也可以交互使用,例如:
ipof -a -d -x -v -h -
HTH
那么,我现在的解决scheme:
ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"
为什么不dig +short hostname
?
(查询DNS)
在一些Unices上,下面的内容将起作用:
arp <hostname>
例如在Mac OS X上,我得到这个:
arp My-iMac.local My-iMac.local (192.168.1.2) -- no entry
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'