从主机名获取IP地址的最简单方法是什么?
我正在考虑尝试a ping
并从输出中解析它。但是,这似乎不太好,并且可能无法在所有系统上以相同的方式工作。
我四处搜寻,找到了的解决方案nslookup
,但不适用于中的主机名/etc/hosts
。
从主机名获取IP地址的最简单方法是什么?
我正在考虑尝试a ping
并从输出中解析它。但是,这似乎不太好,并且可能无法在所有系统上以相同的方式工作。
我四处搜寻,找到了的解决方案nslookup
,但不适用于中的主机名/etc/hosts
。
Answers:
您可以使用标准系统调用来执行此操作。这是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
etc。
perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'
。
sed -e '/some people consider Perl a better form/s/better/worse/'
SCNR
host <hostname>
例如:
serv ~ $ host stackoverflow.com
stackoverflow.com has address 69.59.196.211
在Linux(至少是某些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
/etc/hosts
。)尝试host localhost
。
resolveip
在我的Debian上默认未安装。
这个古老的职位似乎有很多创造性的解决方案。
如果我需要确保也/etc/hosts
可以访问,则倾向于使用
getent hosts somehost.com
至少在“ /etc/nsswitch.conf”已配置为使用文件(通常如此)的情况下,此方法有效。
ahosts
也不返回,而确实返回多行信息。
对于IPv4,有一个标准程序可以使用包含/ etc / hosts的解析器直接使用:
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 -
高温超导
为什么不dig +short hostname
呢?
(查询DNS)
/etc/hosts
在内。
好吧,我目前的解决方案:
ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"
sed
在每个系统上的行为略有不同。:)真烦人。我对其进行了一些更改,我认为它现在应该可以在任何地方使用。
在某些Unices上,以下方法将起作用:
arp <hostname>
例如在Mac OS X上,我得到以下信息:
arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry
arp -n hostname
显示IP。
nmap -sP 192.168.1.0/24|grep SEARCHED_HOSTNAME|sed -n 's/.*[(]\([0-9\.]*\)[)].*/\1/p'