尊重/ etc / hosts的主机查找


19

实用程序喜欢hostdig让您看到与主机名相对应的IP地址。

也有getent可用于查询/etc/hosts或其他NSS数据库的实用程序。

我正在寻找一种方便的标准实用程序(例如Debian中提供的实用程序),该实用程序可以解析主机名,而不管其定义在何处。

它应该或多或少等于

ping "$HOST" | head -1 | perl -lne '/\((.*?)\)/ && print $1'

5
到底是什么问题getent
Patrick

2
是的,我认为它比getent更方便。
Bratchley

@Patrick:嗯,我没有意识到getentDNS也出现了(我以为它只出现在/etc/hosts)。现在,我已经尝试过了:这是什么问题getent:for google.com,它返回一个地址,该地址为IPv6。这无济于事,因为我位于IPv4网络上,并且我的命令实际上会打印一个IPv4地址。
Roman Cheplyaka

@RomanCheplyaka-请参阅eppesuig的答案,该答案显示了如何使用getent仅查找IPv4地址:unix.stackexchange.com/a/71392/7453
slm

Answers:



14

如果问题是您不想使用ipv6解析这些名称,则只需要求getent仅使用ipv4。这将枚举所有ipv4地址:

giuseppe@blatta:~$ getent ahostsv4 www.google.com | cut -d' ' -f1 | sort -u
173.194.40.80
173.194.40.81
173.194.40.82
173.194.40.83
173.194.40.84

对于那些愿意忘记历史记录(即IPv4)的人,请使用ahostsv6
吕克(Luc)2015年

2
对于那些想避免考虑IPv4和IPv6之间差异的人,请使用getent ahosts google.com
Mikko Rantalainen

6

事情是有几个API要像解析主机名gethostbynamegetaddrinfoinet_pton与其中的一些可以返回多个地址和/或可以查询你想要的地址类型。

如果您想要一种可移植的方式来获取一个 IPv4地址,那么也许:

perl -MSocket -le 'print inet_ntoa inet_aton shift' www.google.com

2

(仅当您是计算机的root用户时,此答案才适用。)

我曾经也为此感到烦恼,然后我在所有机器上运行dnsmasq进行了标准化。Dnsmasq是轻型DNS缓存。作为附带好处,它可以提供/etc/hostsDNS上的内容。


2

gethostip -d name.domainsyslinuxUbuntu(甚至可能是Debian)的软件包中下载。-d输出十进制格式。


0

我用我的纯Perl知识,并编写了一个带有错误处理的小脚本:

/ usr / local / bin / gethostip:

#!/usr/bin/perl

# inspired by: /unix/71379/host-lookup-that-respects-etc-hosts#71393

use strict;
use Socket;

my $name = $ARGV[0];
if ($name eq '') {
  print STDERR "Usage: gethostip <hostname>\n";
  exit 1;
}
my $ip = inet_aton($name);
die("Unable to resolve host name $name") if ($ip eq '');
my $ipstr = inet_ntoa($ip);
print "$ipstr\n";

首先向StéphaneChazelas表示最初的想法

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.