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
一部のディストリビューション(CentOSなど)では廃止されているため、スクリプトでIPアドレスを取得するためにifconfig
を使用しないことをお勧めします(デフォルトではインストールしない)。
他のシステムでは、ifconfigの出力はディストリビューションのリリースによって異なります(たとえば、ifconfig
のoutput/spacing/fieldsは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
が推奨されない理由の一例を参照してください: BBB: `bbb-conf --check`がIPアドレスを` inet`として表示-ifconfig woes
ifconfig
が廃止される理由については、 「ifconfig」コマンドと「ip」コマンドの違い を参照してください
ifconfig
は、長期間にわたってLinuxネットワークスタックに完全に対応できなかったnet-toolsからのものです。また、ネットワーク構成にioctlを引き続き使用します。これは、カーネルと対話するための醜く強力でない方法です。2005年頃、ネットワークスタックを制御するための新しいメカニズムであるnetlinkソケットが導入されました。
ネットワークインターフェースを構成するには、
iproute2
はその全二重netlinkソケットメカニズムを利用しますが、ifconfig
はioctlシステムコールに依存しています。
Awk
ソリューション:
ifconfig -a | awk 'NR==2{ sub(/^[^0-9]*/, "", $2); printf "IP=%s\n", $2; exit }'
出力例:
IP=10.0.2.15