Ответы:
сохраните это в файле и затем запустите 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 | 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)
Взято с /programming//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 addr show label 'enp*'
больше, но меня раздражает разбор, что-то вроде ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
может работать ... как красиво
Ответ @ markus-lindberg - мой любимый. Если вы добавите -o -4
флаги ip, то вы получите намного более легко анализируемый (и последовательный) вывод:
ip -o -4 a | awk '$2 == "eth0" { gsub(/\/.*/, "", $4); print $4 }'
-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
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'
В основном 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:
Захвачены один или несколько непробельных символов, которые находятся рядом со строкой, и, наконец, мы печатаем только эти захваченные символы.
Вы должны использовать 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
Я предлагаю использовать библиотеку 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]
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}"
ifconfig eth0|grep 'inet '|awk '{print $2}'
это также может быть использовано обычным пользователем.
ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
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:
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, это никогда не подведет;)
ip
, используйте -o
опцию.
В моем сценарии я использую что-то вроде этого:
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
Это не порождает никакого процесса.