最初に/ etc / hostsを使用してホスト名を解決するLinuxコマンドラインユーティリティ


36

解決ホスト名(といくつかのコマンドラインユーティリティがありhostdignslookup)しかし、それらはすべて使用のネームサーバは、一般一見でアプリケーションながら、排他的に、/etc/hosts最初は(にgethostbynameを使用して、私は信じています)。

通常のアプリケーションのように動作するホスト名を解決するコマンドラインユーティリティはあり/etc/hostsますか?

(おそらく3行のcのようなものになることは承知していますが、多少移植性のあるシェルスクリプト内で必要です。)


あなたの状況をもう少し説明してもらえますか?DOESのawk '/hostname/ { print $1 }' /etc/hostsヘルプ?
量子

@quanta実際には、現在の解決策は/ etc / hostsのgrep / sedマジックです。フォールバックを使用してより一般的なものにしたかったのです。
ズラン

回答:


56

これは簡単に実現できますgetent

getent hosts 127.0.0.1

getentで設定された任意のタイプのデータを検索しますnsswitch.conf


これは、digやのような他のメカニズムを持たないAlpineドッカーコンテナーで使用するツールですnslookup
ブルーノブロノスキー

26

機能するツールの1つですgetent。だからgetent hosts www.google.com、またはを使用することができますgetent hosts localhost。ネームサービススイッチの設定で指定されているように、データベースからエントリを取得します/etc/nsswitch.conf


1
はい、しかしそれはDNSにフォールバックしません。
スローポイズン

いいえ、nsswitch.confの順序で解決します。
cjc

@ slowpoison、nsswitchの設定を見てください。私のシステムにはfiles dnsホストがあります。つまり、/ etc / hostsが参照され、次にDNSリゾルバーが参照されます。設定は異なる場合があります。
ゾレダチェ

@cjc、そうです。私はそれを正しく試したとは思わない。
slowpoison

@Zoredache、私は非常に感銘を受けましたgetent。このコマンドの紹介をありがとう。
-slowpoison

8

gethostbyname()(非推奨)ラッパーを次のように使用できます。

python -c 'import socket;print socket.gethostbyname("www.google.com")'

または、次のようなgetaddrinfo()ラッパー:

python -c 'import socket;print socket.getaddrinfo("www.google.com","http")[0][4][0]'

getaddrinfoはすべてのインスタンスをリストとして返すことに注意してください。コマンドの最後の部分では、最初のタプルのみが選択されます。これはIPv6アドレスを返すこともできます。


1
これは機能しますが、しばらくの間廃止されています。linux.die.net/man/3/gethostbynameを参照してください。
カイルスミス

ありがとう、私はそれについて知りませんでした。;)
Mircea Vutcovici

賛成票を持っている。他のセミポータブルワンライナーは提案されていません。
user239558

:場合、これは誰にも価値がある、私はいくつかのコマンドラインオプション付きのPython 3バージョン作っgithub.com/acdha/unix_tools/blob/master/bin/getaddrinfo
クリス・アダムス

6

resolveip これを行います。

奇妙なことに、RHELとUbuntuのmysql-serverパッケージの一部です。


6

[ここでお気に入りの言語]を使用して、getnameinfoを呼び出すスクリプトを作成できます。これがバイナリ(pingなど)の実行方法であるため、同じ処理を確実に行うことができます。


6

getent ahostsたとえば、を使用します。

$ getent ahosts www.google.com | sed -n 's/ *STREAM.*//p'
216.58.210.196
2a00:1450:4006:803::2004

glibcリゾルバーを介して、すべてのIPv4およびIPv6アドレスを取得します(/etc/hosts通常はで構成されているように、最初に使用します/etc/nsswitch.conf)。

を使用しないでくださいgetent hosts。IPv6アドレスまたはIPv4アドレス(両方ではない)が提供され、選択したプロトコルが機能しない場合があります。実際、一般にIPv6アドレスが優先されますが、一部の場所では、ルーターによってIPv6データがフィルター処理されます(サポートされません)。



2

あなたは本当にハックして使うことができますarp

arp -n somehostname | tr -d '()' | awk '{print $2}'

しかし、それは本当にいので、そうすべきではありません。


2

getent hostsは壊れてます。IPv6アドレスgai.confを優先するため、ipv4を優先するように構成する必要がありますが...

Perl gethostbynameは次の優先順位を使用します/etc/nsswitch.conf

hosts: files dns

だから、これgetent hostsは私にとってうまくいくはずです。

また:

perl -e 'use Socket; print inet_ntoa(inet_aton("www.google.com")) . "\n";'

動作するはずです。


5
壊れていません。getaddrinfo(/etc/gai.confを読み取ります)を使用していません。getaddrinfoを使用するには、を実行しgetent ahostsます。
craig65535

1

これを試して:

if [ `grep -c "hostname" /etc/hosts` -ge 1 ]; then
    ip=`awk '/hostname/ { print $1 }' /etc/hosts`
else
    ip=`host hostname | awk '/hostname has address/ { print $4 }'`
fi

-1

次のコマンドは、DNSサーバーの直接ルックアップを介してDNS / etc / hostsを介してルックアップを実行します。

ping -W2 -c1 google.com | grep PING | sed -r "s/^[^\(]*\(([\.0-9]*)\).*/\1/"

このコマンドは、2秒の待機タイムアウトでドメイン(この場合はgoogle.com)にpingを試行し、「PING google.com(216.58.199.36)56(84 )」を選択してから、ストリームエディタ(sed)を使用して最初のブラケットセットを検出し、その中から探しているIPアドレスであるデータを抽出します。

注:URLに括弧(丸括弧)がある場合、正規表現は機能しませんが、これはまれなケースです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.