プライマリインターフェイスで構成された内部IPアドレスを出力するスクリプトを生成する必要があります。
答え1
ここには素晴らしい答えがたくさんありますが、一般的なアプローチを追加したいと思いました。
最も簡単な解決策は、パブリックインターネットアドレスへのルートを取得することです。
$ ip route get 1.1.1.1 | grep -oP 'src \K\S+'
192.168.0.20
別の回避策は、デフォルトゲートウェイをインポートし、そのゲートウェイと通信するために使用されるIPアドレスを取得することです。
$ ip route get $(ip route show 0.0.0.0/0 | grep -oP 'via \K\S+') | grep -oP 'src \K\S+'
192.168.0.20
答え2
以下はもう少し簡潔な別のアプローチですprocfs
(Linuxを使用していると仮定)。
default_iface=$(awk '$2 == 00000000 { print $1 }' /proc/net/route)
ip addr show dev "$default_iface" | awk '$1 ~ /^inet/ { sub("/.*", "", $2); print $2 }'
これにより、インターフェイスの IPv4 および (利用可能な場合) IPv6 アドレスが返されます。テストの1つだけが必要な場合(inet
IPv4およびinet6
IPv6検索)、テストを変更できます。
$ default_iface=$(awk '$2 == 00000000 { print $1 }' /proc/net/route)
$ ip addr show dev "$default_iface" | awk '$1 ~ /^inet/ { sub("/.*", "", $2); print $2 }'
10.0.2.15
fe80::a00:27ff:fe45:b085
$ ip addr show dev "$default_iface" | awk '$1 == "inet" { sub("/.*", "", $2); print $2 }'
10.0.2.15
$ ip addr show dev "$default_iface" | awk '$1 == "inet6" { sub("/.*", "", $2); print $2 }'
fe80::a00:27ff:fe45:b085
答え3
私が一番好きなのは以下です。
基本インターフェイスを取得します。
$ ip r | grep -oP 'default .* \K.+'
eth0
インターフェイスのIPを取得します。
$ ip a show eth0 | grep -oP 'inet \K[\d\.]+'
10.33.44.135
包括的な:
$ ip a show $(ip r | grep -oP 'default .* \K.+') | grep -oP 'inet \K[\d\.]+'
10.33.44.135
答え4
別の方法は次のとおりです。
ip a|awk /$(ip r|awk '/default/ { print $5 }')/|awk '/inet/ { print $2 }'| cut -f1 -d"/"
これの利点は、すべてのLinuxシステムでのみデフォルトで利用可能であることip a
です。ip r