Unixシェルを使用してホスト名からIPアドレスを取得する簡単な方法


12

ホスト名からIPアドレスを取得する最も簡単な方法は何ですか?

私は試してみてping、出力から解析することを考えていました。ただし、それはあまり良いとは思えず、おそらくすべてのシステムで同じように機能するとは限りません。

私は少し探して解決策を見つけましたnslookupが、のホスト名では機能しません/etc/hosts


Unixシェルがなぜプログラミング言語と見なされないのか、まだ少し疑問に思っています
アルバート

シェルは伝統的にプログラミングではなくスクリプトと見なされているため;)
Tino

回答:


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 gethostbynameなどでシステムコールのマニュアルページを参照してください。


クール、それは動作します。ESPの。、 perl -MSocket -MData::Dumper -wle'my @addresses = gethostbyname("www.google.com"); my @ips = map { inet_ntoa($_) } @addresses[4 .. $#addresses]; print $ips[0]'
アルバート

この答えがいくつかのプログラムコードであることは非常に奇妙です。実際にはServerfaultに属していません。しかし、私はとにかく答えを受け入れます。
アルバート

@Albert:公平に言うと:1.質問は最初にSOに投稿され、SFに移行されまし。一部の人々はPerlをシェルスクリプトのより良い形式と考えています:D
エーテル

@エーテルsed -e '/some people consider Perl a better form/s/better/worse/'SCNR
ティノ

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
アルバート

serv ~ $ host localhost \n localhost has address 127.0.0.1

うーん、まあ、ここではない。なぜそれがあなたのために働くのか興味があります。またはなぜそれが私のためにしない。
アルバート

2
私の編集を参照してください-あなたが試すかもしれませんresolveip

フム、resolveip私のDebianにデフォルトでインストールされていません。
アルバート

9

この古代の投稿には多くの創造的な解決策があるようです。

私も/etc/hostsアクセスすることを確認する必要がある場合は、使用する傾向があります

getent hosts somehost.com

これは、少なくともファイルを使用するように「/etc/nsswitch.conf」が設定されている場合に機能します(通常どおり)。


素敵で、IPv6でも機能します。
ティノ

また、syslinuxをインストールする必要はありません!
クラウディウ

興味深いことに、一部のIPでは何も返されず、ahosts複数行の情報が返されます。
アコスタディノフ

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

gethostipIPv6のような、しかし許可された迅速で汚いシェルの使用も考えられます:

ip="`ipof -6 -- heise.de`"

また、たとえば次のようにインタラクティブに使用することもできます。

ipof -a -d -x -v -h -

HTH


ここに来てこの答えを出し、代わりにあなたに投票しました。
はない

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各システムでわずかに異なる動作をするようです。:)どのように迷惑。少し変更しましたが、今ではどこでも動作するはずです。
アルバート

3

どうしてdig +short hostname

(クエリDNS)


それは/etc/hosts考慮されません。
ジャンヌピッカライネン

DNSは名前解決の決定的なソースであると想定されており、ホストファイルを使用してオーバーライドする場合は問題ありません。しかし、それは決定的なものではなくオーバーライドです
...-gWaldo

私は知っていますが、元の質問には/ etc / hostsが
必要でした

案の定; 私の読解が失敗する
...-gWaldo

0

一部のUnicesでは、以下が機能します。

arp <hostname>

たとえば、Mac OS Xでは、次のようになります。

arp My-iMac.local
My-iMac.local (192.168.1.2) -- no entry

さて、エントリは見つかりますが、IPではなくMACのみをリストします。:)
アルバート

ああ、arp -n hostnameIPを表示します。
アルバート

この方法は、ネットワーク外のサーバーでは機能しません。:P
アルバート

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
さまざまなスイッチに関するもう少しの情報と使用した理由が回答に追加されます
デイブM

この答えがうまくいかない理由は少なくとも4つあります。回答が見つかるIPアドレスの範囲について想定します。必要以上に多くのネットワークトラフィックを生成するため、非効率的です。プローブに応答するIPアドレスに対してのみ機能します。リバースDNSにはフォワードDNSとまったく同じマッピングが含まれていると想定しています。
カスペルド
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.