Як захопити першу IP-адресу з команди ifconfig?


9

Як захопити першу IP-адресу, що приходить від ifconfigкоманди?

ifconfig -a
enw178032: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 100.14.22.12  netmask 255.255.0.0  broadcast 100.14.255.255
        inet6 fe80::250:56ff:fe9c:158a  prefixlen 64  scopeid 0x20<link>
        ether 00:10:56:9c:65:8a  txqueuelen 1000  (Ethernet)
        RX packets 26846250  bytes 12068811576 (11.2 GiB)
        RX errors 0  dropped 58671  overruns 0  frame 0
        TX packets 3368855  bytes 1139160934 (1.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Очікуваний результат:

IP=100.14.22.12

3
На запитання відповіли або за допомогою awk, або grep / cut і т. Д. Але загалом все-таки погана ідея використовувати та grep з ifconfig. ip краще підходить і підтримується в сучасних версіях Linux.
Педро

1
Це звучить як проблема XY. Якої інформації ви насправді хочете? Основна IP-адреса машини, що відповідає мережі? Будь-яка IP-адреса машини, що стоїть на мережі? IP-адреса першого мережного адаптера? Будь-яка IP-адреса, неважливо, що це? Напевно, існує більш прямий, точний та портативний спосіб отримати потрібну інформацію.
alex.forencich

Відповіді:


20

Краще уникати використання ifconfigдля отримання IP-адреси в скриптах, вона застаріла в деяких дистрибутивах (наприклад, CentOS та інші, більше не встановлюйте її за замовчуванням).

В інших системах вихід ifconfig змінюється залежно від випуску дистрибутива (наприклад, вихід / інтервал / поля ifconfigвідрізняються від Debian 8 до Debian 9, наприклад).

Для отримання IP-адреси ipаналогічним чином ви запитуєте:

ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '

Або ще краще:

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '
192.168.1.249

Або, як ви запитаєте "IP ="

#!/bin/bash
echo -n "IP="
ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print $4 } '

Безсоромно адаптуючи ідею від @Roman

$ ip -o -4  address show  | awk ' NR==2 { gsub(/\/.*/, "", $4); print "IP="$4 } ' 
IP=192.168.1.249

Нормальний вихід:

 $ ip -o -4  address show 
1: lo    inet 127.0.0.1/8 scope host lo\       valid_lft forever preferred_lft forever
2: eth0    inet 192.168.1.249/24 brd 192.168.1.255 scope global eth0\       valid_lft forever preferred_lft forever

Від man ip:

-o, -одне
виведення кожного запису в одному рядку, замінюючи канали рядків символом '\'. Це зручно, коли ви хочете порахувати записи з wc (1) або зібрати (1) вихід.

Перегляньте один приклад того, чому ifconfigне рекомендується: BBB: `bbb-conf - галочка`, що показує IP-адреси як` inet` - ifconfig woes

Щоб зрозуміти, чому ifconfigсаме на вихід, див. Відмінність між командами 'ifconfig' та 'ip'

ifconfig- це мережеві інструменти, які давно не змогли повністю не відставати від мережевого стеку Linux. Він також все ще використовує ioctl для конфігурації мережі, що є некрасивим і менш потужним способом взаємодії з ядром.

Приблизно у 2005 році був введений новий механізм управління мережевим стеком - мережеві сокети.

Для налаштування мережевого інтерфейсу iproute2використовується цей повнодуплексний механізм роз'єму мережі, при цьому ifconfigпокладається на системний виклик ioctl.


Я вважаю за краще не встановлювати eth0 за замовчуванням, оскільки це ім'я, що змінюється на машинах, можемо надати гнучкий синтаксис
yael

@yael Змінився, вийняв eth0. Однак Роман краще за мене надрукував "IP =" всередині awk. Занадто багато сил для мене, все ще прокидаючись. Уникайте ifconfig, це не має майбутнього, і положення IP-адреси змінюється, є щонайменше дві різні версії / реалізації (?) Для Linux, які я знаю.
Rui F Ribeiro

Щойно для інформації, на новіших версіях iproute2 (наприклад, не на CentOS7 і Debian8) ip може приймати -briefпараметр, і його вихід стає простішим для розбору ( 2015-08-31 : git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/… )
AB

@AB також -o, як я використовую, допомагає, спасибі, перевіряю це ou
Rui F Ribeiro

1
Ах, я не знав про те, -oщо насправді здається корисним для сценаріїв
AB


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.