web-dev-qa-db-ja.com

インターネットに接続しているデフォルトのインターフェースのIPアドレスを表示する方法

デフォルトのインターフェースとして設定されている、内部IPアドレスを出力するスクリプトを作成する必要があります。

8

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
5
Chris Down

ここで良い答えがたくさんありますが、私の通常のアプローチを投入したいと思いました:

最も簡単な解決策は、パブリックインターネットアドレスのルートを取得することです。

$ 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
7
Patrick

これが私が書いたものです:

  1. 「route」コマンドからデフォルトのインターフェースを取得します。

どのインターフェイスが「デフォルト」であるかが出力されます。私のホストでは、デフォルト行の最後の列を取得する必要があります。

[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
  1. 「ifconfig」を使用して、そのインターフェースのIPアドレスを取得します。

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
1

/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+'
0
Bogdan Velcea

私の好きなものは以下の通りです。

デフォルトのインターフェースを取得します。

$ 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
0
Ashald

デフォルトのインターフェイスに割り当てられた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の出力)を解析するためですが、動作するはずです。

0
peterph

デフォルトのインターフェースを持つ単純なコマンド。

ip route | grep src | awk '{print $NF; exit}'

すべてのUnix OSでテスト済み

0
M.S.Arun

これはCentos 7で私にとってはうまくいきました。ipを使用してデフォルトのインターフェースを見つけてください

ifconfig $(ip route | awk '/default/ { print $5 }') | grep "inet " | awk '{print $2}'
0
N A