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

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

19 ответов

Решение

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

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

Ради предоставления другого варианта, вы можете использовать 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)

Взято с https://stackoverflow.com/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 (вместо 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

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

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

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

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

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'

В базовом седе, \(...\) называется группа захвата, которая используется для захвата символов. Мы могли бы ссылаться на эти захваченные символы с помощью обратной ссылки. \([^[: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: захватывается строка и, наконец, мы печатаем только эти захваченные символы.

ip addr|awk '/eth0/ && /inet/ {gsub(/\/[0-9][0-9]/,""); print $2}'

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

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

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

Еще одна опция, которая может быть полезна, если у вас нет 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}"

Вот для 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 ).+(?=\/)"

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

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

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

В наши дни с несколькими интерфейсами (например, если вы используете докер) и интерфейс именования 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, это никогда не подведет;)

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

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

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

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

Я предлагаю использовать библиотеку 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]

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

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

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

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

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.

Если eth0 имеет несколько IP-адресов, и вы ищете общедоступный, вот пример игнорирования двух наиболее распространенных внутренних диапазонов IP-адресов.

      ip -4 addr show eth0 | grep -oP '(?<=inet\s)\d+(\.\d+){3}' | grep --invert-match -P '^(10\.|192\.168\.)'

При этом игнорируются IP-адреса 10.0.0.0/8 и 192.168.0.0/16.

Да, вы можете сделать это, как предлагают другие записи, но вы также можете сделать это как bauss:

      #!/bin/bash
#
# IPs Table

type column &>/dev/null || apt-get install -yq bsdextrautils

links() { ip link | awk '/^[0-9]+:/ { sub(":", "", $2); sub("@.*", "", $2 ); print $2; }'; }
ipof()  { ip addr show ${1:-enp6s0} | awk ' /link.ether/ { print "mac", $2 }
                                           /inet6*/ { print $1, $2 }'; }
( echo dev inet inet6 mac
for i in `links`; do
    unset ips a b c d
    ips=$(ipof $i)
    if [[ -z $ips ]]; then
        mac=.
        inet=.
        inet6=.
    else
        read -s -r -d ';' _ mac _ inet _ inet6 <<< "$ips;"
        if [[ -z $inet6 ]] && [[ $inet =~ :: ]]; then
            inet6=$inet
            inet=
        fi
    fi
    echo $i ${inet:--} ${inet6:--} ${mac:--}
done; ) | column -t

Скрипт из моей коллекции

Пример вывода А:

      dev       inet              inet6                         mac
lo        127.0.0.1/8       ::1/128                       00:00:00:00:00:00
enp6s0    192.168.0.4/24    fe80::aaa1:59ff:fe50:85ea/64  a8:a1:59:50:85:ea
enp4s0d1  -                 -                             24:8a:07:6b:5d:52
ibp4s0    -                 -                             80:00:02:20:fe:80:00:00:00:00:00:00:24:8a:07:03:00:6b:5d:51
virbr0    192.168.122.1/24  -                             52:54:00:f3:77:52
virbr1    192.168.39.1/24   -                             52:54:00:cf:77:c6
vboxnet0  -                 -                             0a:00:27:00:00:00
vboxnet1  -                 -                             0a:00:27:00:00:01
vboxnet2  -                 -                             0a:00:27:00:00:02
vboxnet3  -                 -                             0a:00:27:00:00:03
vboxnet4  -                 -                             0a:00:27:00:00:04

Пример вывода Б:

      dev              inet             inet6                         mac
lo               127.0.0.1/8      ::1/128                       00:00:00:00:00:00
ens3             10.40.237.34/18  fe80::8de:f6ff:fe19:f315/64   0a:de:f6:19:f3:15
lxcbr0           172.16.0.1/16    fe80::216:3eff:fe00:0/64      00:16:3e:00:00:00
vaf.sta.RsuBSCQ  -                fe80::fc91:4fff:fed1:6adc/64  fe:91:4f:d1:6a:dc
vaf.cra.G4EHHKb  -                fe80::fc47:69ff:fe86:abc6/64  fe:47:69:86:ab:c6
vaf.com.t2VC1vD  -                fe80::fc25:cff:fec5:515b/64   fe:25:0c:c5:51:5b
vaf.lor.cXYkGKF  -                fe80::fce8:6dff:fed1:8d08/64  fe:e8:6d:d1:8d:08
vaf.iff.2I4P4ay  -                fe80::fca0:6dff:fe33:e198/64  fe:a0:6d:33:e1:98
vaf.bag.etDqGZ3  -                fe80::fca6:c9ff:fe17:8e4f/64  fe:a6:c9:17:8e:4f
vaf.bor.L9tqMch  -                fe80::fc90:92ff:fe48:bf48/64  fe:90:92:48:bf:48
vaf.dan.GhojJo8  -                fe80::fc0c:71ff:feaa:8b81/64  fe:0c:71:aa:8b:81
vaf.tru.ZuH5xfb  -                fe80::fc2e:21ff:fe91:2ce5/64  fe:2e:21:91:2c:e5
vaf.huo.6ii1Tyy  -                fe80::fcbe:fbff:fe59:44f5/64  fe:be:fb:59:44:f5
vaf.nwt.CFoTS9J  -                fe80::fc5d:3fff:feac:917f/64  fe:5d:3f:ac:91:7f
vethe8qi4n       -                fe80::fca2:10ff:feec:5e2b/64  fe:a2:10:ec:5e:2b
vaf.cra.6gHyk8E  -                fe80::fc23:4bff:fe2c:e9b/64   fe:23:4b:2c:0e:9b


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