デフォルトのインターフェースとして設定されている、内部IPアドレスを出力するスクリプトを作成する必要があります。
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アドレスの両方を返します。どちらか一方だけが必要な場合はテストを変更できます(IPv4の場合はinet
を探し、inet6
for 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
ここで良い答えがたくさんありますが、私の通常のアプローチを投入したいと思いました:
最も簡単な解決策は、パブリックインターネットアドレスのルートを取得することです。
$ 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
これが私が書いたものです:
どのインターフェイスが「デフォルト」であるかが出力されます。私のホストでは、デフォルト行の最後の列を取得する必要があります。
[root@pppdc9prd3ga mdesales]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.4.0 * 255.255.252.0 U 0 0 0 bridge0
10.132.60.0 * 255.255.252.0 U 0 0 0 eth4
link-local * 255.255.0.0 U 1002 0 0 eth4
link-local * 255.255.0.0 U 1003 0 0 bridge0
default 10.132.60.1 0.0.0.0 UG 0 0 0 eth4
Addr:値を取得するだけです。
[root@pppdc9prd3ga mdesales]# ifconfig eth4
eth4 Link encap:Ethernet HWaddr 00:50:56:01:42:91
inet addr:10.132.63.191 Bcast:10.132.63.255 Mask:255.255.252.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1346288 errors:0 dropped:0 overruns:0 frame:0
TX packets:438844 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:276243478 (263.4 MiB) TX bytes:116188062 (110.8 MiB)
これが私が思いついたスクリプトです。
/app/myPublicIp.sh
defaultInterface=$(route | grep default | awk '{print $(NF)}')
ifconfig $defaultInterface | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
これが実行中です:
/app/ipFor.sh
10.132.63.191
/proc
を使用している(ただしiproute
ツールを使用していない)Linux OS:
cat /proc/net/fib_trie|grep -A50 '\|-- 0\.0\.0\.0$'|grep -B50 -wm1 'LOCAL'|tail -n2|grep -oP '\|-- \K\S+'
私の好きなものは以下の通りです。
デフォルトのインターフェースを取得します。
$ 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
デフォルトのインターフェイスに割り当てられたIPアドレス(質問のコメントから私が理解したもの)が必要な場合は、スイスのアーミーナイフのネットワーク設定(ip
)を使用するだけで十分です。
$ ip route | grep '^default'
default via 10.176.143.1 dev eth1 metric 203
$ ip addr show eth1
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether c0:de:f1:72:30:48 brd ff:ff:ff:ff:ff:ff
inet 10.176.143.71/24 brd 10.176.143.255 scope global eth1
valid_lft forever preferred_lft forever
これは
$ ip addr show \
$( /sbin/ip route \
| grep '^default'\
| sed 's/^.*dev \([^ \t]*\) .*$/\1/' )
これは醜いです。なぜなら、それはおそらく実際には解析されることを意図されていなかったもの(ip route
の出力)を解析するためですが、動作するはずです。
デフォルトのインターフェースを持つ単純なコマンド。
ip route | grep src | awk '{print $NF; exit}'
すべてのUnix OSでテスト済み
これはCentos 7で私にとってはうまくいきました。ip
を使用してデフォルトのインターフェースを見つけてください
ifconfig $(ip route | awk '/default/ { print $5 }') | grep "inet " | awk '{print $2}'