Моя основная задача - узнать частный 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
Может кто-нибудь помочь мне в этом?
Почему Вы не используете простой ifconfig {interfacename}
?
Для получения только IP-адреса я сделал бы:
ifconfig eth0 | grep inet | grep -v inet6 | awk '{ print $2 }'
Я получил ответ: Сначала Вы добираетесь, фактическое имя интерфейса Вашей машины затем отфильтровывают ip
ifconfig $(route | grep '^default' | grep -o '[^ ]*
Предположение, что желаемый интерфейс является основным устройством (наименьшая метрика) шлюз, пробует:
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" для предотвращения разрешения имен хостов.