Как отобразить IP-адрес Интерфейса по умолчанию с Интернет-соединением?

Альтернатива ls если Вы только хотите некоторые поля, OS/X's stat команда:

find . ! -name . -prune ! -type d -exec stat -t '%FT%T' -f '%15z %SB %N' {} +

Или с zsh:

command stat -t '%FT%T' -f '%15z %SB %N' -- *(D^/)

(%B, ls -U OS/X конкретный, другие Нельды обычно не имеют inode времен рождения).

6
09.11.2014, 20:12
8 ответов

Вот еще один слегка метод Terser с использованием PRECFS (предполагает, что вы используете 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 интерфейс. Вы можете изменить тест, если вы хотите только один или другой (искать 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
5
27.01.2020, 20:24

Если то, что вы хотите, это 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-маршрута ), но должно сработать.

0
27.01.2020, 20:24

Вот что я писал:

  1. Получите интерфейс по умолчанию из команды «Маршрут».

Это распечатает, какой интерфейс является «по умолчанию». Для моего хоста мне нужно получить последний столбец строки по умолчанию.

[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
27.01.2020, 20:24

Здесь много хороших ответов, но хотел бросить в мой обычный подход:

Самое простое решение - получить маршрут для общедоступного интернет-адреса:

$ ip route get 1.1.1.1 | grep -oP 'src \K\S+'
192.168.0.20

Другое решение - получить шлюз по умолчанию, а затем получить IP Addr используется для связи с этим шлюзом:

$ 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
4
27.01.2020, 20:24

Простая команда с интерфейсом по умолчанию.

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

Проверено на всех ОС Unix

0
27.01.2020, 20:24

Это сработало для меня на Centos 7. Найдите интерфейс по умолчанию, используяip

ifconfig $(ip route | awk '/default/ { print $5 }') | grep "inet " | awk '{print $2}'
0
27.01.2020, 20:24

Любая ОС Linux -с использованием /proc(, но без использования iprouteинструментов):

cat /proc/net/fib_trie|grep -A50 '\|-- 0\.0\.0\.0$'|grep -B50 -wm1 'LOCAL'|tail -n2|grep -oP '\|-- \K\S+'
0
27.01.2020, 20:24

Мой любимый следующий.

Получить интерфейс по умолчанию:

$ 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
1
27.01.2020, 20:24

Теги

Похожие вопросы