Как я могу отобразить IP-адрес, показанный на eth0, используя скрипт?
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
Обновление : если это не работает для вас, попробуйте другой ответ
grep "inet"
Ради предоставления другой опции, вы можете использовать
ip addr
команду таким образом, чтобы получить IP-адрес: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-адреса.В скрипте:
источник
Взято с /programming//a/14910952/1695680
Однако это может вернуть локальный IP-адрес (127.0.0.1), поэтому вам, возможно, придется использовать и отфильтровать:
Из man-страниц имени хоста:
источник
ip addr show label 'enp*'
больше, но меня раздражает разбор, что-то вродеip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
может работать ... как красивоОтвет @ markus-lindberg - мой любимый. Если вы добавите
-o -4
флаги ip, то вы получите намного более легко анализируемый (и последовательный) вывод:-o
означает--oneline
, что предназначено, чтобы помочь именно в таких ситуациях.-4
Добавляются к пределу в IPv4 - адрес, что и все другие ответы предполагают.источник
ip
флаги. Использование,cut
а не продвинутоеawk
волшебство:ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
путь после того, как узналawk
, и мне нравится минимизировать количество команд в моих конвейерах. Хорошее предложение в любом случае.Вот несколько советов .....
Awk
Функция split в приведенной выше команде awk разбивает второй столбец на основе разделителя
:
и сохраняет разделенное значение в ассоциативный массивa
. Такa[2]
держит ценность вторая часть.СЭД
В основном sed,
\(...\)
называется группа захвата, которая используется для захвата персонажей. Мы могли бы ссылаться на эти захваченные символы с помощью обратной ссылки.\([^[:space:]]\+\)
захватывает любой символ, но не пробел один или несколько раз.Grep
\K
удаляет ранее сопоставленные символы из печати в финале и\S+
соответствует одному или нескольким непробельным символам.Perl
inet addr:
Захвачены один или несколько непробельных символов, которые находятся рядом со строкой, и, наконец, мы печатаем только эти захваченные символы.источник
Вот хороший, только использует grep в качестве вторичной команды:
ip addr show eth0 | grep -oP 'inet \ K \ S [0-9.] +'
Я не понимаю, почему вы должны использовать больше команд, чем нужно
источник
Вы должны использовать
ip
(вместоifconfig
), поскольку он актуален, поддерживается, и, возможно, что наиболее важно для целей написания сценариев, он дает согласованный и анализируемый вывод. Ниже приведены несколько похожих подходов:Если вы хотите IPv4-адрес для вашего интерфейса Ethernet
eth0
:Как скрипт:
Результат, полученный выше, находится в нотации CIDR. Если нотация CIDR не нужна, ее можно удалить:
Другой вариант, который IMHO является «наиболее элегантным», - это получение IPv4-адреса для любого интерфейса, используемого для подключения к указанному удаленному хосту (в данном случае 8.8.8.8). Предоставлено @gatoatigrado в этом ответе :
Как скрипт:
Это прекрасно работает на хосте с одним интерфейсом, но более выгодно также на хостах с несколькими интерфейсами и / или спецификациями маршрутов.
Хотя это
ip
был бы мой предпочтительный подход, это, конечно, не единственный способ снять шкуру с этой кошки. Вот еще один подход, который использует,hostname
если вы предпочитаете что-то более простое / более краткое:Или, если вы хотите адрес IPv6:
Как скрипт:
источник
Я предлагаю использовать библиотеку Python, такую как netifaces, которая специально разработана для этой цели.
Чтобы получить используемый по умолчанию сетевой интерфейс.
источник
Это единственное использование,
ip addr
которое является заменойifconfig
иawk
объединено с заменой (gsub).Прекратите использовать слишком много процессов для простых задач
источник
Еще одна опция, которая может быть полезна, если у вас нет awk (как в некоторых встроенных устройствах):
источник
ifconfig eth0|grep 'inet '|awk '{print $2}'
источник
вот для 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 ).+(?=\/)"
источник
это также может быть использовано обычным пользователем.
источник
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
дважды вместо комбинацииawk
иcut
для анализа выходных данных. В следующий раз вам лучше сначала проверить все остальные ответы и убедиться, что вы не публикуете дублирующее решение. В данном случае здесь, я думаю, можно спорить, является ли это дубликатом или просто похожим, поэтому, пожалуйста, примите это как общий совет. Спасибо.Это самый короткий путь, который я мог найти:
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.источник
в наши дни с несколькими интерфейсами (например, если вы используете докер) и интерфейс именования ETH больше не является нормой
Я использую эту команду для извлечения IP / Mask:
Поэтому независимо от того, сколько у меня будет интерфейсов и как бы их ни называли, GREP будет захватывать только первый, имеющий опцию MULTICAST.
Я использую эту команду, чтобы извлечь только IP без маски:
Я использую эти команды на разных BDS & NIX, это никогда не подведет;)
источник
ip
, используйте-o
опцию.В моем сценарии я использую что-то вроде этого:
Это не порождает никакого процесса.
источник
Еще один способ (если вы не хотите
CIDR
адрес и хотитеIPv4
):ip
команду, которая неdeprecated
источник