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
答え1
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
これが推奨されない理由の例を参照してください。BBB: "bbb-conf --check"はIPアドレスを "inet"としてマークします。 - ifconfigの問題
ifconfig
終了が差し迫った理由を理解するには、次を参照してください。「ifconfig」と「ip」コマンドの違い
ifconfig
net-toolsからのこのツールは、長い間Linuxネットワーキングスタックに完全に従うことができませんでした。また、ネットワーク構成にはまだioctlを使用していますが、これはカーネルと対話する醜く弱い方法です。2005年頃にネットワークスタックを制御するための新しいメカニズムであるnetlinkソケットが導入されました。
iproute2
全二重ネットリンクソケットメカニズムを利用し、ifconfig
ioctlシステムコールに依存するようにネットワークインタフェースを設定します。
答え2
Awk
解決策:
ifconfig -a | awk 'NR==2{ sub(/^[^0-9]*/, "", $2); printf "IP=%s\n", $2; exit }'
出力例:
IP=10.0.2.15
答え3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}