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


12

从主机名获取IP地址的最简单方法是什么?

我正在考虑尝试a ping并从输出中解析它。但是,这似乎不太好,并且可能无法在所有系统上以相同的方式工作。

我四处搜寻,找到了的解决方案nslookup,但不适用于中的主机名/etc/hosts


我仍然想知道为什么不将Unix shells不视为编程语言……
艾伯特(Albert)2010年

因为传统上将shell视为脚本而不是编程;)
Tino 2013年

Answers:


5

您可以使用标准系统调用来执行此操作。这是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 gethostbynameetc。


太好了,那行得通。ESP, perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'
艾伯特2010年

很奇怪,这个答案是一些程序代码... :)看起来几乎像一个Stackoverflow答案。确实不属于Serverfault。但是我还是会接受答案的。
艾伯特2010年

@Albert:公平地说:1.该问题最初在SO上发布并迁移到SF,并且2.您要查找的数据类型需要用某种东西解析;有人认为Perl是更好的Shell脚本形式:D
Ether

@Ether sed -e '/some people consider Perl a better form/s/better/worse/'SCNR
Tino

11

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
艾伯特2010年

serv ~ $ host localhost \n localhost has address 127.0.0.1

嗯,嗯,不在这里。我很好奇为什么对您有用。还是为什么它不适合我。
艾伯特2010年

2
查看我的编辑-您可以尝试resolveip

嗯,resolveip在我的Debian上默认未安装。
艾伯特2010年

9

这个古老的职位似乎有很多创造性的解决方案。

如果我需要确保也/etc/hosts可以访问,则倾向于使用

getent hosts somehost.com

至少在“ /etc/nsswitch.conf”已配置为使用文件(通常如此)的情况下,此方法有效。


很好,并且也适用于IPv6。
蒂诺2015年

而且不需要安装syslinux!
Claudiu

有趣的是,对于某些IP,它什么ahosts也不返回,而确实返回多行信息。
akostadinov

7

对于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 -

高温超导


来到这里给这个答案,反而投票给你。
现在不是

4

为什么不dig +short hostname呢?

(查询DNS)


它没有考虑/etc/hosts在内。
Janne Pikkarainen

DNS应该是“名称解析”的权威来源,如果您使用主机文件覆盖它,那就很好了。但这是一个替代,不是
权威

我知道,但是最初的问题想要/ etc / hosts :)
Janne Pikkarainen

果然; 我的阅读理解失败了……
gWaldo 2011年

3

好吧,我目前的解决方案:

ping -c1 -n www.google.com | head -n1 | sed "s/.*(\([0-9]*\.[0-9]*\.[0-9]*\.[0-9]*\)).*/\1/g"

这不仅仅提供IP:PING www.l.google.com(72.14.234.104):56个数据字节
Federico klez Culloca

是的,似乎sed在每个系统上的行为略有不同。:)真烦人。我对其进行了一些更改,我认为它现在应该可以在任何地方使用。
艾伯特


0

使用ping并不是那么糟糕,因为您通常没有任何强依赖性。

这是我在Linux系统上使用的功能:

getip () { ping -c 1 -t 1 $1 | head -1 | cut -d ' ' -f 3 | tr -d '()' ; }

-1
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地址

2
有关各种开关的更多信息以及使用原因的更多信息,将为您带来更多帮助
Dave M

至少有四个不同的原因使该答案无法起作用。您对将在其中找到答案的IP地址范围进行假设。由于产生比所需更多的网络流量,因此效率低下。它仅适用于响应探测的IP地址。假定反向DNS包含与正向DNS完全相同的映射。
kasperd 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.