Отображение IP-адреса на интерфейсе eth0


24

Как я могу отобразить IP-адрес, показанный на eth0, используя скрипт?

Ответы:


28

сохраните это в файле и затем запустите bash <filename>

#!/bin/bash
ifconfig eth0 | grep "inet addr"

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

#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1

Обновление : если это не работает для вас, попробуйте другой ответ


2
конечно, это не работает в последней версии Ubuntu. последний ifconfig возвращает «inet <ip>» вместо «inet addr <ip>»
спасибо

Вы можете просто использоватьgrep "inet"
Андрей Радулеску

26

Ради предоставления другой опции, вы можете использовать ip addrкоманду таким образом, чтобы получить IP-адрес:

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 показывает информацию о eth0
  • grep "inet\b"показывает только строку с адресом IPv4 (если вы хотите адрес IPv6, измените его на "inet6\b")
  • awk '{print $2}' печатает на втором поле, которое имеет ipaddress / mask, пример 172.20.20.15/25
  • cut -d/ -f1 принимает только часть IP-адреса.

В скрипте:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)

это решение действительно работает!
Тханг

IP-4 ... и IP-6 ...! Спасибо!
TamusJRoyce

17

Взято с /programming//a/14910952/1695680

hostname -i

Однако это может вернуть локальный IP-адрес (127.0.0.1), поэтому вам, возможно, придется использовать и отфильтровать:

hostname -I

Из man-страниц имени хоста:

-i, --ip-address

Показать сетевой адрес (а) имени хоста. Обратите внимание, что это работает, только если имя хоста может быть разрешено. Избегайте использования этой опции; используйте вместо этого имя хоста --all-ip-address.

-I, --all-ip-addresses

Показать все сетевые адреса хоста. Эта опция перечисляет все настроенные адреса на всех сетевых интерфейсах. Интерфейс обратной связи и локальные адреса IPv6 опущены. В отличие от опции -i, эта опция не зависит от разрешения имени. Не делайте никаких предположений о порядке вывода.


к сведению, мне нравится ip addr show label 'enp*'больше, но меня раздражает разбор, что-то вроде ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2может работать ... как красиво
ThorSummoner

5

Ответ @ markus-lindberg - мой любимый. Если вы добавите -o -4флаги ip, то вы получите намного более легко анализируемый (и последовательный) вывод:

ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'

-oозначает --oneline, что предназначено, чтобы помочь именно в таких ситуациях. -4Добавляются к пределу в IPv4 - адрес, что и все другие ответы предполагают.


Люблю ipфлаги. Использование, cutа не продвинутое awkволшебство:ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ

@ ДаффДж, наверное, дело личного вкуса. Я «открыл» cutпуть после того, как узнал awk, и мне нравится минимизировать количество команд в моих конвейерах. Хорошее предложение в любом случае.
Амос Шапира

Я полностью согласен, Амос. Спасибо за ваше решение!
DuffJ

3

Вот несколько советов .....

Awk

ifconfig eth0 | awk '/inet addr/{split($2,a,":"); print a[2]}'

Функция split в приведенной выше команде awk разбивает второй столбец на основе разделителя :и сохраняет разделенное значение в ассоциативный массив a. Так a[2]держит ценность вторая часть.

СЭД

ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'

В основном sed, \(...\)называется группа захвата, которая используется для захвата персонажей. Мы могли бы ссылаться на эти захваченные символы с помощью обратной ссылки. \([^[:space:]]\+\)захватывает любой символ, но не пробел один или несколько раз.

Grep

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\Kудаляет ранее сопоставленные символы из печати в финале и \S+соответствует одному или нескольким непробельным символам.

Perl

ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'

inet addr:Захвачены один или несколько непробельных символов, которые находятся рядом со строкой, и, наконец, мы печатаем только эти захваченные символы.


@edwardtorvalds добавил некоторые объяснения. Я думаю, что это будет полезно для будущих читателей. Не стесняйтесь задавать любые вопросы из вышеперечисленных команд ... :)
Avinash Raj

2

Вот хороший, только использует grep в качестве вторичной команды:

ip addr show eth0 | grep -oP 'inet \ K \ S [0-9.] +'

Я не понимаю, почему вы должны использовать больше команд, чем нужно


2

Вы должны использовать ip(вместо ifconfig), поскольку он актуален, поддерживается, и, возможно, что наиболее важно для целей написания сценариев, он дает согласованный и анализируемый вывод. Ниже приведены несколько похожих подходов:

Если вы хотите IPv4-адрес для вашего интерфейса Ethernet eth0:

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

Как скрипт:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

Результат, полученный выше, находится в нотации CIDR. Если нотация CIDR не нужна, ее можно удалить:

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

Другой вариант, который IMHO является «наиболее элегантным», - это получение IPv4-адреса для любого интерфейса, используемого для подключения к указанному удаленному хосту (в данном случае 8.8.8.8). Предоставлено @gatoatigrado в этом ответе :

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166

Как скрипт:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

Это прекрасно работает на хосте с одним интерфейсом, но более выгодно также на хостах с несколькими интерфейсами и / или спецификациями маршрутов.

Хотя это ipбыл бы мой предпочтительный подход, это, конечно, не единственный способ снять шкуру с этой кошки. Вот еще один подход, который использует, hostnameесли вы предпочитаете что-то более простое / более краткое:

$ hostname --all-ip-addresses | awk '{print $1}'  

Или, если вы хотите адрес IPv6:

$ hostname --all-ip-addresses | awk '{print $2}'  

Как скрипт:

$ MYV4IP=$(hostname --all-ip-addresses | awk '{print $1}') 
$ MYV6IP=$(hostname --all-ip-addresses | awk '{print $2}')
$ echo $MYV4IP
192.168.1.166 
$ echo $MYV6IP 
2601:7c1:103:b27:352e:e151:c7d8:3379

1

Я предлагаю использовать библиотеку Python, такую ​​как netifaces, которая специально разработана для этой цели.

sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

Чтобы получить используемый по умолчанию сетевой интерфейс.

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]


1

Еще одна опция, которая может быть полезна, если у вас нет awk (как в некоторых встроенных устройствах):

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"


1

вот для IPv4 :

ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"

Вот для IPv4 & конкретного разработчика (eth0):

ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"

для IPv6 :

ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"


0

это также может быть использовано обычным пользователем.

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6

он попросит eth0, эта версия вашего скрипта может помочь (также покажет loopback tho)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt

Это в значительной степени тот же ответ, что и в askubuntu.com/a/560466/367990 , только с использованием cutдважды вместо комбинации awkи cutдля анализа выходных данных. В следующий раз вам лучше сначала проверить все остальные ответы и убедиться, что вы не публикуете дублирующее решение. В данном случае здесь, я думаю, можно спорить, является ли это дубликатом или просто похожим, поэтому, пожалуйста, примите это как общий совет. Спасибо.
Byte Commander

0

Это самый короткий путь, который я мог найти:

ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'

Замените $1на свой сетевой интерфейс.

ip -f inet говорит ip только возвращать значения для семейства inet (ipv4).

grep -Po говорит grep взаимодействовать со следующим значением как perl-regex и печатать только совпадающие значения.

Регулярное выражение \K[\d.]+говорит: «отбросьте все до этой точки (\ K) и сопоставьте столько числовых значений, за которыми следует точка в строке». Таким образом, это будет соответствовать только IP-адресу и игнорировать все после него, включая маску подсети shortform \ XX.


0

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

Я использую эту команду для извлечения IP / Mask:

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

Поэтому независимо от того, сколько у меня будет интерфейсов и как бы их ни называли, GREP будет захватывать только первый, имеющий опцию MULTICAST.

Я использую эту команду, чтобы извлечь только IP без маски:

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

Я использую эти команды на разных BDS & NIX, это никогда не подведет;)


Если вы собираетесь анализировать вывод ip, используйте -oопцию.
Муру

0

В моем сценарии я использую что-то вроде этого:

re="inet[[:space:]]+([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)"
if [[ $(ip addr show eth0) =~ $re ]]; then
    echo ${BASH_REMATCH[1]}
else
    echo "Cannot determin IP" 1>&2
fi

Это не порождает никакого процесса.


0

Еще один способ (если вы не хотите CIDRадрес и хотите IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • Использует ipкоманду, которая неdeprecated
  • Использует только одну команду для фильтрации
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.