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

17

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

    
задан user43389 11.12.2014 в 23:56
источник

15 ответов

24

сохраните это в файле, а затем запустите 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
    
ответ дан Edward Torvalds 12.12.2014 в 00:00
источник
18

Для обеспечения другого варианта вы можете использовать команду 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)
    
ответ дан Alaa Ali 12.12.2014 в 03:16
14

Взято из Ссылка

hostname -i

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

hostname -I

Из файлов manname:

-i, --ip-address

Display the network address(es) of the host name. Note that this works only if the host name can be resolved. Avoid using this option; use hostname --all-ip-addresses instead.

-I, --all-ip-addresses

Display all network addresses of the host. This option enumerates all configured addresses on all network inter‐faces. The loopback interface and IPv6 link-local addresses are omitted. Contrary to option -i, this option does not depend on name resolution. Do not make any assumptions about the order of the output.

    
ответ дан ThorSummoner 09.03.2016 в 21:01
4
Ответ на

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

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

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

    
ответ дан Amos Shapira 14.06.2016 в 03:43
3

Вот некоторые oneliners .....

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:]]\+\).*//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: , захватываются и, наконец, мы печатаем только эти захваченные символы.

    
ответ дан Avinash Raj 12.12.2014 в 08:28
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]
    
ответ дан Sandeep 09.04.2016 в 02:34
1
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

Используйте только ip addr , которая заменяет ifconfig и awk в сочетании с заменой (gsub).

Прекратите использовать слишком много процессов для простых задач

    
ответ дан Markus Lindberg 23.10.2015 в 10:42
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}"
    
ответ дан Fulvio Flaco 02.08.2016 в 14:43
1

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

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

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

    
ответ дан Rick 18.07.2017 в 21:10
1

ifconfig eth0|grep 'inet '|awk '{print $2}'

    
ответ дан Maksim Kostromin 10.11.2017 в 21:58
1

здесь для IPv4 :

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

здесь для IPv4 & amp; особенно dev (eth0):

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

для IPv6 :

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

    
ответ дан XXL 13.02.2018 в 13:04
0

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

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
    
ответ дан Matheus Baldasso 24.03.2017 в 20:34
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.

    
ответ дан Ryan 19.07.2017 в 08:27
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 & amp; NIX никогда не терпит неудачу;)

    
ответ дан JOduMonT 26.10.2017 в 09:28
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

В нем нет никакого процесса.

    
ответ дан Maciej Wawrzyńczuk 29.10.2017 в 19:43