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

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

24
задан 11 December 2014 в 15:56

17 ответов

сохраните это в файле и затем работайте 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

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

28
ответ дан 23 November 2019 в 01:15

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

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

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

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

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

regex \K[\d.]+ говорит, "выбрасывают все до этой точки (\K), и соответствие как можно больше числовых значений, сопровождаемых точкой подряд". Это будет поэтому только соответствовать IP-адресу и игнорировать все после него, включая краткую форму \XX маска подсети.

0
ответ дан 23 November 2019 в 01:15

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

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
0
ответ дан 23 November 2019 в 01:15

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

IP addr показывают eth0 | grep-oP 'inet \K\S [0-9]. +'

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

2
ответ дан 23 November 2019 в 01:15

Просто еще одна опция, которая может быть полезной, если у Вас нет 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
ответ дан 23 November 2019 в 01:15
ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

Это единственное использование ip addr, который является заменой для ifconfig и awk объединенный с заменой (gsub).

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

1
ответ дан 23 November 2019 в 01:15

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

функция разделения Awk

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

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

sed

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: строка, получены, и наконец мы печатаем те полученные символы только.

3
ответ дан 23 November 2019 в 01:15

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

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

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

5
ответ дан 23 November 2019 в 01:15

Взятый от https://stackoverflow.com/a/14910952/1695680

hostname -i

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

hostname -I

Из страниц справочника имени хоста:

-i, --ip-address

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

-I, --all-ip-addresses

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

17
ответ дан 23 November 2019 в 01:15

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

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 информация о шоу [приблизительно 114]
  • 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)
26
ответ дан 23 November 2019 в 01:15

Я предлагаю пользоваться библиотекой 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
ответ дан 23 November 2019 в 01:15

в эти дни с интерфейсами кратных чисел (например, если Вы используете докера) и называющий интерфейс ETH не больше нормы

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

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, которую это никогда не приводит к сбою ;)

0
ответ дан 23 November 2019 в 01:15

вот для IPv4:

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

вот для IPv4 и конкретного dev (eth0):

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

для IPv6:

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

1
ответ дан 23 November 2019 в 01:15

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

1
ответ дан 23 November 2019 в 01:15

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

Если Вы хотите адрес 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  

Другая опция, которая, по моему скромному мнению, является "самой изящной", добирается, адрес 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
2
ответ дан 23 November 2019 в 01:15

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

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
ответ дан 23 November 2019 в 01:15

Еще один путь (принимающий Вас не хотят a CIDR обратитесь и хотите IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • Использование ip команда, которая не является deprecated
  • Использование только одна команда для фильтрации
0
ответ дан 23 November 2019 в 01:15

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

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