web-dev-qa-db-ja.com

/ etc / hostsを尊重するホスト検索

HostDigなどのユーティリティを使用すると、ホスト名に対応するIPアドレスを確認できます。

/etc/hostsまたは他のNSSデータベースのクエリに使用できるgetentユーティリティもあります。

どこに定義されているかに関係なくホスト名を解決する便利な標準ユーティリティ(Debianで利用可能など)を探しています。

それは多かれ少なかれ同等であるべきです

ping "$Host" | head -1 | Perl -lne '/\((.*?)\)/ && print $1'
20
Roman Cheplyaka

あなたが望むことをする私が知っている唯一のコマンドはresolveipです:

http://linux.die.net/man/1/resolveip

ただし、mysql-serverのみが付属しているため、どこにでもインストールするのは理想的ではありません。

4
Georgyo

問題が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
15
eppesuig

問題は、gethostbynamegetaddrinfoinet_ptonなどのホスト名を解決するためのいくつかのAPIがあり、それらのいくつかは複数のアドレスを返すことができ、および/またはあなたが欲しいアドレス。

one IPv4アドレスを取得するポータブルな方法が必要な場合は、おそらく:

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

gethostip -d name.domain(Ubuntu(およびおそらくDebian)のsyslinuxパッケージから。 -d 10進形式で出力します。

2
dan3

(この回答は、マシンのrootである場合にのみ適用されます。)

以前はこれにも悩まされていましたが、すべてのマシンで dnsmasq を実行するように標準化しました。 Dnsmasqは軽量のDNSキャッシュです。副次的な利点として、/etc/hosts DNS経由。

純粋なPerlの知識を使用して、エラー処理を備えた小さなスクリプトを作成しました。

/ usr/local/bin/gethostip:

#!/usr/bin/Perl

# inspired by: https://unix.stackexchange.com/questions/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に感謝

0
Daniel Alder