ifconfigコマンドから最初のIPアドレスを取得する方法


9

ifconfigコマンドからの最初のIPアドレスを取得するにはどうすればよいですか?

ifconfig -a
enw178032: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.14.22.12  netmask 255.255.0.0  broadcast 100.14.255.255
        inet6 fe80::250:56ff:fe9c:158a  prefixlen 64  scopeid 0x20<link>
        ether 00:10:56:9c:65:8a  txqueuelen 1000  (Ethernet)
        RX packets 26846250  bytes 12068811576 (11.2 GiB)
        RX errors 0  dropped 58671  overruns 0  frame 0
        TX packets 3368855  bytes 1139160934 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

期待される結果:

IP=100.14.22.12

3
awkまたはgrep / cutなどを使用して質問に回答しました。ただし、ifconfigからgrepを使用することは、それでも一般に悪い考えです。最新のLinuxビルドでは、ipの方が適し、サポートも優れています。
ペドロ

1
これはXY問題のように聞こえます。本当にどんな情報が欲しいですか?マシンのメインのネットワーク側IPアドレス?マシンのネットワークに面したIPアドレスはありますか?最初のネットワークアダプターのIPアドレス?IPアドレスは何でも構いません。おそらく、必要な情報を取得するためのより直接的、正確、かつ移植可能な方法があるでしょう。
alex.forencich

回答:


20

ifconfig一部のディストリビューション(CentOSなど)では廃止されているため、スクリプトでIPアドレスを取得するためにを使用することは避けた方がよいでしょう。デフォルトではインストールしないでください。

他のシステムでは、ifconfigの出力はディストリビューションのリリースによって異なります(たとえば、の出力/スペース/フィールドifconfigは、Debian 8とDebian 9では異なります)。

でIPアドレスを取得するipには、同様の方法で次のように質問します。

ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '

またはもっと良い:

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
192.168.1.249

または、「IP =

#!/bin/bash
echo -n "IP="
ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '

@Romanのアイデアを恥知らずに適応させる

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print "IP="$4 } ' 
IP=192.168.1.249

通常の出力:

 $ ip -o -4  address show 
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: eth0    inet 192.168.1.249/24 brd 192.168.1.255 scope global eth0\       valid_lft forever preferred_lft forever

からman ip

-o、-onelineは、
各レコードを1行に出力し、改行を「\」文字に置き換えます。これは、wc(1)でレコードをカウントしたり、出力をgrep(1)したりする場合に便利です。

ifconfig推奨されない理由の1つの例を参照してください:BBB:IPアドレスを「inet」として表示する「bbb-conf --check」-ifconfig woes

なぜそうなっているか理解するにifconfigは、「ifconfig」コマンドと「ip」コマンドの違いをご覧ください。

ifconfig長い間Linuxネットワークスタックに完全に追いつくことができなかったnet-toolsからのものです。また、ネットワーク構成にioctlを引き続き使用します。これは、カーネルと対話するための醜くて強力ではない方法です。

2005年頃、ネットワークスタックを制御するための新しいメカニズムであるnetlinkソケットが導入されました。

ネットワークインターフェースを構成するには、ioctlシステムコールに依存しiproute2ながら、その全二重のnetlinkソケットメカニズムをifconfig利用します。


私はeth0をデフォルトとして設定しないほうがいいです。なぜなら、この名前はマシン上で変化するため、柔軟な構文を提供できるからです
yael

@yael変更、eth0を取り出した。ただし、Romanの方が私よりも「IP =」を印刷するほうが上手でしたawk。私にはあまりにも多くの能力があり、まだ目覚めています。避けてくださいifconfig、将来はありません、そしてIPアドレスの変更の位置、私が知っているLinuxには少なくとも2つの異なるバージョン/実装(?)があります。
ルイFリベイロ

参考までに、新しいバージョンのiproute2(例:CentOS7でもDebian8でもない)では、ipは-briefパラメーターを受け取ることができ、その出力は解析しやすくなります(2015-08-31:git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/...
AB

@ABも-o使用しているので、役立ちます。ありがとう、ouをチェックします
Rui F Ribeiro

1
ああ、-o実際にスクリプトに役立つと思われるものについては知りませんでした
AB

6

Awk 解決:

ifconfig -a | awk 'NR==2{ sub(/^[^0-9]*/, "", $2); printf "IP=%s\n", $2; exit }'

出力例:

IP=10.0.2.15

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.