Как найти действительный частный IP-адрес машины из всех интерфейсов?

Моя основная задача - узнать частный IP-адрес действующего интерфейса в Linux-машине.

например. У меня 7 интерфейсов, и из 7 у меня есть два интерфейса docker0 с IP-адресами 172.12.2.1 и eth0 172.23.32.201

, и из этих двух мне нужно только 172.23.32.201 за один снимок.

Я попробовал два разных метода, чтобы сделать это:

1) I tried $(hostname -I | awk '{print $1}') but does it guarantees that i get the host instance IP.

2) ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
This gives me all the ip address of every interface

Может кто-нибудь помочь мне в этом?

0
задан 25 September 2019 в 11:00

3 ответа

Почему Вы не используете простой ifconfig {interfacename}?

Для получения только IP-адреса я сделал бы:

ifconfig eth0 | grep inet | grep -v inet6 | awk '{ print $2 }'
0
ответ дан 23 October 2019 в 10:32

Я получил ответ: Сначала Вы добираетесь, фактическое имя интерфейса Вашей машины затем отфильтровывают ip

ifconfig $(route | grep '^default' | grep -o '[^ ]*

) | grep inet | grep -v inet6 | awk '{ print $2 }'

0
ответ дан 23 October 2019 в 10:32

Предположение, что желаемый интерфейс является основным устройством (наименьшая метрика) шлюз, пробует:

ip address show "$(ip route | grep '^default' | head -n 1 | awk '{ print $5 }')" | grep inet | grep -v inet6 | awk -F" " '{ print $2 }' | cut -d/ -f1

Это использует более новую интерфейсную команду, "IP" от "iproute2" пакета, вместо более старого "ifconfig" и "маршрута" от пакета "сетевых инструментов". Команда может быть сокращена для использования просто "IP шоу..." и "IP r...", но я использовал полный переключатель для ясности. С ifconfig/route:

ifconfig "$(route -n | grep '^0.0.0.0' | head -n 1 | awk '{ print $8 }')" | grep inet | grep -v inet6 | awk '{ print $2 }'

Используя "маршрут-n" для предотвращения разрешения имен хостов.

0
ответ дан 23 October 2019 в 10:32

Другие вопросы по тегам:

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