eth0インターフェイスでIPアドレスを表示する


24

スクリプトを使用してeth0に表示されるIPアドレスを表示するにはどうすればよいですか?

回答:


28

これをファイルに保存してから実行します bash <filename>

#!/bin/bash
ifconfig eth0 | grep "inet addr"

IPアドレスを示す数字のみを取得するためのより正確な方法:

#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1

更新:これがうまくいかない場合は、他の答えを試してください


2
もちろん、これは最新のubuntuでは機能しません。"INET <IP>"の代わりに"INET addrの<IP>"の最新ifconfigコマンドリターン
タン

あなただけ使用することができますgrep "inet"
アンドレイ・ラダレスキュー

26

別のオプションを提供するために、ip addr次のコマンドを使用してIPアドレスを取得できます。

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 に関する情報を表示します eth0
  • grep "inet\b"IPv4アドレスを持つ行のみを表示します(IPv6アドレスが必要な場合は、に変更します"inet6\b"
  • awk '{print $2}' ipaddress / maskがある2番目のフィールドに印刷します。例 172.20.20.15/25
  • cut -d/ -f1 IPアドレス部分のみを使用します。

スクリプト内:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)

このソリューションは実際に機能します!
タン

ip -4 ...およびip -6 ...!ありがとうございました!
TamusJRoyce

17

/programming//a/14910952/1695680から取得

hostname -i

ただし、ローカルIPアドレス(127.0.0.1)が返される場合があるため、次を使用し、フィルタリングする必要があります。

hostname -I

ホスト名のマンページから:

-i, --ip-address

ホスト名のネットワークアドレスを表示します。これは、ホスト名を解決できる場合にのみ機能することに注意してください。このオプションの使用は避けてください。代わりにhostname --all-ip-addressesを使用してください。

-I, --all-ip-addresses

ホストのすべてのネットワークアドレスを表示します。このオプションは、すべてのネットワークインターフェースで設定されたすべてのアドレスを列挙します。ループバックインターフェイスとIPv6リンクローカルアドレスは省略されています。オプション-iとは異なり、このオプションは名前解決に依存しません。出力の順序について何も仮定しないでください。


記録のために、私は好きip addr show label 'enp*'良く、私は迷惑な解析、のようなものであるip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2か、かなり缶仕事...
ThorSummoner

5

@ markus-lindbergの応答は私のお気に入りです。-o -4ipのフラグに追加すると、より簡単に解析可能な(一貫した)出力が得られます。

ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'

-o--oneline、まさにこのような状況で役立つことを意味します。-4他のすべての応答が暗示するものであるIPv4アドレスに制限するために追加されます。


ipフラグが大好きです。cut高度なawkウィザードip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
リティー

@DuffJそれはおそらく個人的な好みの問題です。cutについて学んだ後に「発見」awkし、パイプラインのコマンド数を最小限に抑えることが好きです。いずれにしても素晴らしい提案。
アモスシャピラ

私は完全に同意します、アモス。あなたの解決策をありがとう!
DuffJ

3

ここにonelinersがあります.....

Awk

ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'

上記のawkコマンドのsplit関数は、区切り文字に基づいて2番目の列を分割し、分割:された値を連想配列に格納しaます。したがってa[2]、2番目の部分の値を保持します。

sed

ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'

基本的なsedでは\(...\)、キャラクターをキャプチャするために使用されるキャプチャグループと呼ばれます。後方参照により、これらのキャプチャされた文字を参照できます。\([^[:space:]]\+\)任意の文字をキャプチャしますが、スペースは1回以上キャプチャしません。

grep

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\K前に一致した文字を最後の印刷から破棄し、\S+1つ以上の非スペース文字に一致します。

Perl

ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'

inet addr:文字列の横にある1つ以上の非スペース文字がキャプチャされ、最後にキャプチャされた文字のみが印刷されます。


@edwardtorvaldsはいくつかの説明を追加しました。これは将来の読者に役立つと思います。上記のコマンドからご質問をお気軽に... :)
Avinash Raj 14

2

良いコマンドは次のとおりです。grepをセカンダリコマンドとしてのみ使用します。

ip addr show eth0 | grep -oP 'inet \ K \ S [0-9。] +'

必要以上のコマンドを使用する必要がある理由がわかりません


2

使用する必要がありますip(の代わりにifconfig)現在、維持されており、おそらく最も重要なのはスクリプトの目的であり、一貫した解析可能な出力を生成します。以下は、いくつかの同様のアプローチです。

イーサネットインターフェイスのIPv4アドレスが必要な場合eth0

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

スクリプトとして:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

上記で生成された出力はCIDR表記です。CIDR表記が不要な場合は、削除できます。

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

IMHOが「最もエレガント」な別のオプションは、指定されたリモートホスト(この場合は8.8.8.8)への接続に使用されるインターフェースのIPv4アドレスを取得します。この答えの@gatoatigradoの礼儀:

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166

スクリプトとして:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

これは、単一のインターフェースを持つホスト上で完全に機能しますが、複数のインターフェースやルート仕様を持つホスト上でもより有利に機能します。

一方でip、私の好ましいアプローチになり、それは確かにこの猫を肌する唯一の方法ではありません。hostnameより簡単で簡潔なものを好む場合に使用する別のアプローチを次に示します。

$ hostname --all-ip-addresses | awk '{print $1}'  

または、IPv6アドレスが必要な場合:

$ hostname --all-ip-addresses | awk '{print $2}'  

スクリプトとして:

$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}') 
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166 
$ echo $MYV6IP 
2601:7c1:103:b27:352e:e151:c7d8:3379

1

この目的のために特別に設計されたnetifacesのようなpythonライブラリを使用することをお勧めします。

sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

使用中のデフォルトのネットワークインターフェイスを取得します。

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]


1

awkを持っていない場合に役立つもう1つのオプション(一部の組み込みデバイスの場合):

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"


1

ここのためだのIPv4

ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"

ここのためだのIPv4&特定のDEV(eth0の):

ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"

以下のためのIPv6

ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"


0

これは通常のユーザーでも使用できます。

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6

彼はeth0を要求します。このバージョンのスクリプトが役立ちます(ループバックthoも表示)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt

これはかなり同じ答えですaskubuntu.com/a/560466/367990、ちょうど使用してcutの組み合わせの代わりに二回awkcut出力を解析します。次回は、他のすべての回答を最初にチェックアウトし、重複したソリューションを投稿しないようにする必要があります。ここでのこのケースでは、それが重複するのか、単に類似するのかは議論の余地があると思うので、一般的なヒントとしてそれを受け取ってください。ありがとう。
バイトコマンダー

0

これは私が見つけることができる最短の方法です:

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

$1ネットワークインターフェイスに置き換えます。

ip -f inet ipにinet(ipv4)ファミリの値のみを返すように指示します。

grep -Po 次の値をperl-regexとして扱い、一致する値のみを出力するようにgrepに指示します。

正規表現\K[\d.]+は、「このポイント(\ K)までのすべてを破棄し、できるだけ多くの数値とそれに続くドットが連続して一致する」と言います。したがって、これはIPアドレスとのみ一致し、それ以降のすべて(ショートフォーム\ XXサブネットマスクを含む)を無視します。


0

最近では、複数のインターフェイス(ドッカーを使用する場合など)を使用し、ETHによるインターフェイスの命名はもはや標準ではありません

このコマンドを使用してIP / Maskを抽出します。

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

したがって、インターフェイスの数と名前に関係なく、GREPはMULTICASTオプションを持つ最初のインターフェイスのみを取得します。

このコマンドを使用して、マスクなしでIPのみを抽出します。

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

私はこれらのコマンドを異なるBDSとNIXで使用しますが、決して失敗しません;)


の出力を解析する場合はip-oオプションを使用します。
ムル

0

私のスクリプトでは、次のようなものを使用しています。

re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "Cannot determin IP" 1>&2
fi

プロセスは生成されません。


0

さらに別の方法(CIDRアドレスが不要で、欲しい場合IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • ipではないコマンドを使用しますdeprecated
  • フィルタリングに1つのコマンドのみを使用します
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.