Lepiej unikać używania ifconfig
do 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 ifconfig
róż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 ifconfig
nie jest to zalecane: BBB: `bbb-conf - zaznacz` pokazując adresy IP jako` inet` - ifconfig woes
Aby ifconfig
dowiedzieć się, dlaczego tak się dzieje, zobacz Różnica między poleceniami „ifconfig” i „ip”
ifconfig
pochodzi 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 iproute2
skorzystać z mechanizmu pełnego dupleksu gniazda netlink, a jednocześnie ifconfig
opiera się na wywołaniu systemowym ioctl.