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

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

退屈な解析なしでプログラムでIPアドレスを抽出する簡単な方法はありますかifconfig?これを行うために単純なコマンド出力処理を使用するのは問題ありませんが、どこかでsed複数行のファイルを処理するのは問題ありません。/etc私がしたいのは、こんにちは.bashrcメッセージにホストのIPアドレスを表示するように変更することです。私は使用していますが、Ubuntu 12.04これがディストリビューションに限定されないと思うので、Ubuntuフォーラムの代わりにここに投稿することにしました。

答え1

ノート

  1. NICデバイスハンドル

    次の例では、ネットワークインターフェイス名がWirelessCardであると想定しています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をサポートするように設定されている場合、出力にはIPv6 IPアドレスとともに「点線四辺形」が表示されますifconfig

    たとえば、

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

    以下のコマンドはこれを明示的に無視しますが、この情報を得るために簡単に調整できます。

ソリューション(使用ifconfig

これを行う方法はいくつかあります。たとえば、このawkスクリプトを使用して無線LAN NIC(wlan0)のIPアドレスを確認できます。

$ 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この状況ではこのコマンドを使用するのが最善です。

たとえば、

$ 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

引用する

答え2

$ 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?ホスト名

答え3

これは「ip」を使用するもう1つの方法ですが、デバイスが他のインターフェイス(たとえば、有線イーサネット、時にはWiFi)に接続できる場合にはうまく機能します。多様性のために、「grep」や「perl」の代わりに「sed」も使用します。

これにより、インターネットに接続するルートを持つすべての送信元IPが検索されます。それとも、とにかくGoogleのDNSです。

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

関連情報