使用Unix shell从主机名获取IP地址的简单方法

从主机名获取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' 
  • Nmap从你的子网(192.168.1.0或其他)获取地址
  • 用grep只得到你正在寻找的主机名的行
  • 用sed只能得到括号内的ip地址