web-dev-qa-db-ja.com

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

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

22
user43389

これをファイルに保存してから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

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

27
Edward Torvalds

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

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0eth0に関する情報を表示します
  • grep "inet\b"は、IPv4アドレスを持つ行のみを表示します(IPv6アドレスが必要な場合は、"inet6\b"に変更します)
  • awk '{print $2}'は2番目のフィールドに印刷され、ipaddress/maskがあります。例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)
25
Alaa Ali

https://stackoverflow.com/a/14910952/169568 から取得

hostname -i

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

hostname -I

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

-i, --ip-address

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

-I, --all-ip-addresses

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

17
ThorSummoner

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

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

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

5
Amos Shapira

ここに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つ以上のスペース以外の文字がキャプチャされ、最後にキャプチャされた文字のみが印刷されます。

3
Avinash Raj

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

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

$ 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
2
Seamus

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

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

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

2
Rick

ifconfig eth0|grep 'inet '|awk '{print $2}'

1
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

これは、ifconfigawkを置換(gsub)と組み合わせたものであるip addrのみを使用します。

単純なタスクに多すぎるプロセスの使用を停止する

1
Markus Lindberg

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
Sandeep

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
Fulvio Flaco

IPv4の場合:

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

IPv4&specific dev(eth0)の場合:

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

IPv6

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

1
XXL

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

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

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

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

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

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

grep -Poは、grepに次の値をPerl正規表現として解釈し、一致する値のみを出力するように指示します。

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

0
Ryan

最近では、複数のインターフェイス(ドッカーを使用する場合など)を使用し、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で使用しますが、決して失敗しません;)

0
JOduMonT

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

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つのコマンドのみを使用します
0
htaccess