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


Відповіді:


28

збережіть це у файлі та запустіть 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

Оновлення : якщо це не працює для вас, спробуйте іншу відповідь


2
звичайно, це не працює в останній ubuntu. останні ifconfig повертає "inet <ip>" замість "inet addr <ip>"
thang

ви можете просто скористатисяgrep "inet"
Андрій Радулеску

26

Для надання іншого варіанту ви можете використовувати 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)

це рішення насправді працює!
Танга

ip -4 ... і ip -6 ...! Дякую!
TamusJRoyce

17

Взято з /programming//a/14910952/1695680

hostname -i

Однак це може повернути локальну ip-адресу (127.0.0.1), тому вам, можливо, доведеться використовувати та фільтрувати:

hostname -I

Із керівництвом імені хоста:

-i, --ip-address

Відобразити мережеві адреси (адреси) імені хоста. Зауважте, що це працює лише в тому випадку, якщо ім'я хоста можна вирішити. Уникайте використання цієї опції; використовувати замість імені хоста --all-ip-адреси.

-I, --all-ip-addresses

Показати всі мережеві адреси хоста. Цей параметр перераховує всі налаштовані адреси на всіх мережевих інтерфейсах. Інтерфейс зворотного зв'язку та локальні адреси IPv6 посилань опущені. На відміну від параметра -i, ця опція не залежить від роздільної здатності імені. Не робіть жодних припущень щодо порядку виводу.


для запису мені подобається ip addr show label 'enp*'краще, але мене дратує розбір, щось на кшталт ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2може спрацювати ... як красиво
ThorSummoner

5

@ відповідь Маркуса-Ліндберга - моя улюблена. Якщо ви додасте -o -4до прапорців ip, ви отримаєте набагато простіший (і послідовний) вихід:

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

-oозначає --oneline, що має на меті допомогти в таких ситуаціях. Значення -4додається для обмеження адреси IPv4, що означає всі інші відповіді.


Любіть ipпрапори. Використання, cutа не просунуте awkip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
майстерство

@DuffJ це, мабуть, справа особистого смаку. Я "відкрив" cutшлях після того, як я дізнався про це awk, і мені подобається мінімізувати кількість команд на моїх трубопроводах. Приємна пропозиція в будь-якому випадку.
Амос Шапіра

Я повністю згоден, Амос. Дякуємо за ваше рішення!
DuffJ

3

Ось кілька ліній .....

Awk

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

функція split у наведеній вище команді awk розбиває другий стовпчик на основі роздільника :і зберігає розділене значення в асоціативний масив a. Так a[2]утримується значення другої частини.

sed

ifconfig eth0 | sed -n '/inet addr/s/.*inet addr: *\([^[:space:]]\+\).*/\1/p'

В основному sed, що \(...\)називається захоплюючою групою, яка використовується для захоплення персонажів. Ми могли б посилатись на захоплені символи шляхом зворотного посилання. \([^[:space:]]\+\)фіксує будь-який символ, але не пробіл один або кілька разів.

греп

ifconfig eth0 | grep -oP 'inet addr:\K\S+'

\Kвідкидає попередньо відповідні символи від друку на фіналі та \S+відповідає одному або декільком символам, що не пробіл.

Perl

ifconfig eth0 | perl -lane 'print $1 if /inet addr:(\S+)/'

Один або кілька символів, що не знаходяться пробілом, розташовані поруч із inet addr:рядком, фіксуються, і нарешті ми друкуємо лише ці захоплені символи.


@edwardtorvalds додав пояснення. Думаю, це було б корисно для майбутніх читачів. Не соромтеся задавати будь-які запитання з вищезазначених команд ... :)
Avinash Raj

2

Ось хороший, використовує лише grep як другорядну команду:

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

Я не бачу, чому ви повинні використовувати більше команд, ніж потрібно


2

Ви повинні використовувати 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

1

Я пропоную використовувати бібліотеку python як netiface, яка спеціально розроблена для цієї мети.

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

Ще один варіант, який може бути корисним, якщо у вас немає 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

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


0

це може бути використано і для звичайного користувача.

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

він попросить eth0, ця версія вашого сценарію може допомогти (також показати loopback tho)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt

Це майже та сама відповідь, як askubuntu.com/a/560466/367990 , просто використовуючи cutдвічі замість комбінації awkта cutдля аналізу результатів. Наступного разу краще спершу ознайомитись з усіма іншими відповідями та переконатися, що ви не публікуєте дублікат рішення. У цьому випадку тут я думаю, що це суперечка, чи це дублікат чи просто подібне, тому, будь ласка, сприймайте це як загальну підказку. Спасибі.
Командир байт

0

Це найкоротший шлях, який я міг знайти:

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

Замініть $1ваш мережевий інтерфейс.

ip -f inet повідомляє ip повертати лише значення для сім'ї inet (ipv4).

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

У регулярному вираженні \K[\d.]+сказано: "викиньте все до цього моменту (\ K) і зіставте якомога більше числових значень, за якими слідує крапка в ряд". Тому це буде відповідати лише IP-адресі та ігнорувати все після неї, включаючи маску підмережі shortform \ XX.


0

в ці дні з декількома інтерфейсами (наприклад, якщо ви використовуєте докер) та іменування інтерфейсу 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параметр.
муру

0

У своєму сценарії я використовую щось подібне:

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

Ще один спосіб (якщо припустити, що ви не хочете CIDRадреси та бажаєте IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • Використовує ipкоманду, якої немаєdeprecated
  • Для фільтрації використовується лише одна команда
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.