Jak przechwycić pierwszy adres IP z polecenia ifconfig?

9

Jak przechwycić pierwszy adres IP, który pochodzi z ifconfigpolecenia?

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

Spodziewany wynik:

IP=100.14.22.12
Yael
źródło
3
Odpowiedzi na pytanie, albo za pomocą awk, albo grep / cut itp. Ale ogólnie jest to zły pomysł, aby używać i grep z ifconfig. ip jest lepiej dostosowany i lepiej obsługiwany w nowoczesnych wersjach systemu Linux.
Pedro
1
To brzmi jak problem XY. Jakich informacji naprawdę chcesz? Główny adres IP urządzenia w sieci? Jakiś adres IP urządzenia w sieci? Adres IP pierwszej karty sieciowej? Dowolny adres IP, nie ważne co to jest? Prawdopodobnie istnieje bardziej bezpośredni, dokładny i przenośny sposób na uzyskanie potrzebnych informacji.
alex.forencich

Odpowiedzi:

20

Lepiej unikać używania ifconfigdo uzyskiwania adresu IP w skryptach, ponieważ jest on przestarzały w niektórych dystrybucjach (np. CentOS i inne, nie instaluj go już domyślnie).

W innych systemach dane wyjściowe ifconfig różnią się w zależności od wydania dystrybucji (np. Dane wyjściowe / odstępy / pola ifconfigróżnią się od Debian 8 do Debian 9, na przykład).

Aby uzyskać adres IP ip, w podobny sposób pytasz:

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

Lub jeszcze lepiej:

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

Lub, jak pytasz „IP =”

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

Bezwstydnie dostosowując pomysł @Roman

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

Normalna wydajność:

 $ 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

Od man ip:

-o, -online wypisuje
każdy rekord w jednym wierszu, zastępując przejścia liniowe znakiem „\”. Jest to wygodne, gdy chcesz policzyć rekordy za pomocą wc (1) lub grep (1).

Zobacz jeden przykład, dlaczego ifconfignie jest to zalecane: BBB: `bbb-conf - zaznacz` pokazując adresy IP jako` inet` - ifconfig woes

Aby ifconfigdowiedzieć się, dlaczego tak się dzieje, zobacz Różnica między poleceniami „ifconfig” i „ip”

ifconfigpochodzi z net-tools, który od dłuższego czasu nie był w stanie nadążyć za stosem sieci Linux. Nadal używa ioctl do konfiguracji sieci, co jest brzydkim i mniej wydajnym sposobem interakcji z jądrem.

Około 2005 roku wprowadzono nowy mechanizm kontroli stosu sieciowego - gniazda netlink.

Aby skonfigurować interfejs sieciowy, należy iproute2skorzystać z mechanizmu pełnego dupleksu gniazda netlink, a jednocześnie ifconfigopiera się na wywołaniu systemowym ioctl.

Rui F. Ribeiro
źródło
Wolę nie ustawiać eth0 jako domyślnego, ponieważ ta nazwa zmienia się na komputerach, czy możemy zapewnić elastyczną składnię
yael
@yael Zmieniony, wyjął eth0. Jednak Roman radził sobie lepiej niż ja, drukując w środku „IP ​​=” awk. Dla mnie za dużo siły mózgowej, wciąż się budzę. Unikaj ifconfig, nie ma przyszłości, a pozycja zmian adresu IP, istnieją co najmniej dwie różne wersje / implementacje (?) Dla Linuksa, które znam.
Rui F Ribeiro
Tylko dla informacji, w nowszych wersjach iproute2 (np .: nie na CentOS7 ani Debian8) ip może przyjąć -briefparametr, a jego wynik staje się łatwiejszy do przeanalizowania (2015-08-31: git.kernel.org/pub/scm/network/iproute2 /iproute2.git/commit/… )
AB
@AB również -o jak używam pomaga, dzięki, sprawdzi to ou
Rui F Ribeiro
1
Ach, nie wiedziałem o tym, -oco rzeczywiście wydaje się przydatne w skryptach
AB
6

Awk rozwiązanie:

ifconfig -a | awk 'NR==2{ sub(/^[^0-9]*/, "", $2); printf "IP=%s\n", $2; exit }'

Przykładowe dane wyjściowe:

IP=10.0.2.15
Roman Perekhrest
źródło
-3
ip addr | grep -v 127.0.0.1 | grep 'inet ' | \
awk {'print $2'} | awk -F "/" {'print "IP="$1'}
Brian Olson
źródło
1
zobacz to:ip addr | awk ' !/127.0.0.1/ && /inet/ { gsub(/\/.*/, "", $2); print "IP="$2 } '
Rui F Ribeiro
1
Dlaczego szukacie lokalnego hosta IP 127.0.0.1?
Jeff Schaller