Отображение 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).
Прекратите использовать слишком много процессов для простых задач
Еще одна опция, которая может быть полезна, если у вас нет 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