web-dev-qa-db-ja.com

プログラムでIPアドレスを抽出する簡単な方法はありますか?

ifconfigの面倒な解析なしに、プログラムでIPアドレスを抽出する簡単な方法はありますか? sedを使用してそれを行う単純なコマンド出力処理は気にしませんが、/etcからの複数行ファイルを処理しません。私がやろうとしていることは、挨拶メッセージにホストのIPアドレスを表示するように.bashrcを変更することです。私はUbuntu 12.04を使用していますが、これはディストリビューション固有のものではないと考えているため、Ubuntuフォーラムの代わりにここに投稿することにしました。

43
amphibient

ノート

  1. NICデバイスハンドル

    以下の例では、ネットワークインターフェイスがwlan0という名前のワイヤレスカードであると想定しています。特定の状況に合わせて、例のこのビットを調整してください。たとえば、有線のNIC=カードの場合は、おそらくeth0です。

  2. IPv4 インターネットプロトコルバージョン4)

    また、これらの例はIPv4アドレスを返しています。ほとんどの人が「IPアドレス」として識別する「ドット付きクワッド」。

    例えば:

    inet addr:192.168.1.20  Bcast:192.168.1.255  Mask:255.255.255.0
    
  3. IPv6-(インターネットプロトコルバージョン6)

    システムがIPv6をサポートするように構成されている場合、ifconfig出力に「ドット付きクワッド」とIPv6 IPアドレスの両方が表示されます。

    例えば:

    inet6 addr: fe80::226:c7ff:fe85:a720/64 Scope:Link
    

    以下のコマンドはこれを明示的に無視しますが、代わりにこの情報を取得するために非常に簡単に適応できます。

ソリューション(ifconfigを使用)

これを行うには多くの方法があります。たとえば、次のawkスクリプトを使用して、ワイヤレスLANのIPアドレスを解析できますNIC(wlan0):

$ ifconfig wlan0 | grep "inet " | awk -F'[: ]+' '{ print $4 }'
192.168.1.20

これを行うと、よりコンパクトにすることができます。

$ ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}'
192.168.1.20

Perlを使用して行うこともできます。

$ ifconfig wlan0 | Perl -nle'/t addr:(\S+)/&&print$1'
192.168.1.20

Perlの例は、可能な限りコンパクトです。

これを行う方法は他にも無数にあります。これらは、開始するためのいくつかの例にすぎません。

編集#1

いくつかの追加のメモとコメント。 @StephaneChazelasは、grepを使用したさらにコンパクトなバージョンがあることを示しました。

$ ifconfig wlan0|grep -Po 't addr:\K[\d.]+'
192.168.1.20

このソリューションは、新しいバージョンのgrepの機能を利用してPCRE(Perl正規表現)を利用し、さらに-oスイッチを使用して正規表現に一致するものだけを返します。

ソリューション(ipを使用)

コメントでも述べたように、ifconfigは、最初のアドレスのみを返すため、ネットワークデバイスに複数のIPアドレスが割り当てられているシステムで使用するのは面倒です。したがって、これらの状況ではipコマンドを使用することをお勧めします。

例えば:

$ ip addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20

ipに、特定のネットワークインターフェースのIPv4情報のみを表示するように指示することもできます。この場合は、wlan0という名前のインターフェースのみを調べています。

$ ip -f inet addr show wlan0 | grep -Po 'inet \K[\d.]+'
192.168.1.20

参考文献

47
slm

$ hostname -I

例えば:

$ hostname -I
192.168.1.18

情報。マンページから:

http://manpages.ubuntu.com/manpages/raring/en/man1/hostname.1.html
http://unixhelp.ed.ac.uk/CGI/man-cgi?hostname

24
Robert Vila

これは「ip」を使用した別の例ですが、これは、デバイスが有線イーサネットと時々WiFiなどの異なるインターフェースに接続されている場合に、よりうまく機能します。また、「grep」や「Perl」の代わりに「sed」を使用しました。

これにより、インターネットへのルートを持つソースIPが検出されます。または、いずれにしてもGoogleのDNSに。

ip -o route get 8.8.8.8 | sed -e 's/^.* src \([^ ]*\) .*$/\1/'
7
Zan Lynx