Wyświetlanie adresu IP na interfejsie eth0

24

Jak mogę wyświetlić adres IP pokazany na eth0 za pomocą skryptu?

użytkownik43389
źródło

Odpowiedzi:

28

zapisz to w pliku, a następnie uruchom bash <filename>

#!/bin/bash
ifconfig eth0 | grep "inet addr"

dokładniejsze, aby uzyskać tylko numer pokazujący adres IP:

#!/bin/bash
ifconfig eth0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1

Aktualizacja : jeśli to nie zadziała, wypróbuj inną odpowiedź

Edward Torvalds
źródło
2
oczywiście nie działa to w najnowszym Ubuntu. najnowsze powraca ifconfig "inet <ip>" zamiast "inet addr <ip>"
Thang
możesz po prostu użyćgrep "inet"
Andrei Radulescu
26

Aby zapewnić inną opcję, możesz użyć ip addrpolecenia w ten sposób, aby uzyskać adres IP:

ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1
  • ip addr show eth0 pokazuje informacje o eth0
  • grep "inet\b"pokazuje tylko linię, która ma adres IPv4 (jeśli chcesz adres IPv6, zmień go na "inet6\b")
  • awk '{print $2}' drukuje na drugim polu, na przykład ipaddress / mask 172.20.20.15/25
  • cut -d/ -f1 zajmuje tylko część adresu IP.

W skrypcie:

#!/bin/bash
theIPaddress=$(ip addr show eth0 | grep "inet\b" | awk '{print $2}' | cut -d/ -f1)
Alaa Ali
źródło
to rozwiązanie faktycznie działa!
Thang
ip -4 ... i ip -6 ...! Dziękuję Ci!
TamusJRoyce
17

Zaczerpnięte z /programming//a/14910952/1695680

hostname -i

Może to jednak zwrócić lokalny adres IP (127.0.0.1), więc może być konieczne użycie i filtrowanie:

hostname -I

Na stronach podręcznych nazwy hosta:

-i, --ip-address

Wyświetl adresy sieciowe nazwy hosta. Pamiętaj, że działa to tylko wtedy, gdy nazwa hosta może zostać rozwiązana. Unikaj korzystania z tej opcji; zamiast tego użyj nazwy hosta - all-ip-address.

-I, --all-ip-addresses

Wyświetl wszystkie adresy sieciowe hosta. Ta opcja wylicza wszystkie skonfigurowane adresy na wszystkich interfejsach sieciowych. Interfejs pętli zwrotnej i adresy lokalne łącza IPv6 są pomijane. W przeciwieństwie do opcji -i, ta opcja nie zależy od rozpoznawania nazw. Nie przyjmuj żadnych założeń dotyczących kolejności danych wyjściowych.

ThorSummoner
źródło
dla ip addr show label 'enp*'ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
przypomnienia
5

Odpowiedź Markusa-Lindberga jest moją ulubioną. Jeśli dodasz -o -4do flag ip, to uzyskasz dużo łatwiejsze do parsowania (i spójne) wyjście:

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

-ooznacza --oneline, co ma pomóc w dokładnie takich sytuacjach. -4Jest dodawana do limitu na adres IPv4, który jest co wszystkie inne odpowiedzi sugerować.

Amos Shapira
źródło
Uwielbiam ipflagi. Używanie cutzamiast zaawansowanego awkczarodziejstwa:ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
DuffJ
@DuffJ to prawdopodobnie kwestia osobistego gustu. „Odkryłem” cutsposób po tym, jak się dowiedziałem awki lubię minimalizować liczbę poleceń w moich potokach. W każdym razie miła sugestia.
Amos Shapira,
Całkowicie się zgadzam, Amos. Dzięki za twoje rozwiązanie!
DuffJ,
3

Oto kilka onelinerów .....

Awk

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

funkcja split w powyższej komendzie awk dzieli drugą kolumnę na podstawie separatora :i zapisuje podzieloną wartość w tablicy asocjacyjnej a. Tak a[2]utrzymuje wartość drugiej części.

sed

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

W podstawowym sed, \(...\)zwanym grupą przechwytującą, która służy do przechwytywania postaci. Możemy przechwycić te przechwycone znaki poprzez odsyłanie wstecz. \([^[:space:]]\+\)przechwytuje dowolną postać, ale nie spację raz lub więcej razy.

grep

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

\Kodrzuca poprzednio dopasowane znaki z wydruku na końcu i \S+dopasowuje jeden lub więcej znaków spacji.

Perl

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

inet addr:Przechwytywany jest jeden lub więcej znaków spacji, które znajdują się obok ciągu, i na końcu drukujemy tylko te przechwycone znaki.

Avinash Raj
źródło
@edwardtorvalds dodał pewne wyjaśnienia. Myślę, że byłoby to pomocne dla przyszłych czytelników. Nie krępuj się zadawać pytań z powyższych poleceń ... :)
Avinash Raj
2

Oto dobry, używa grep tylko jako wtórnego polecenia:

adres IP pokaż et0 | grep -oP 'inet \ K \ S [0-9.] +'

Nie rozumiem, dlaczego powinieneś używać więcej poleceń niż potrzeba

Stóg
źródło
2

Powinieneś używać ip(zamiast ifconfig), ponieważ jest aktualny, utrzymywany, a być może co najważniejsze do celów skryptowych, daje spójne i możliwe do przetworzenia wyjście. Oto kilka podobnych podejść:

Jeśli chcesz mieć adres IPv4 dla swojego interfejsu Ethernet eth0:

$ ip -4 -o addr show eth0 | awk '{print $4}'
192.168.1.166/24  

Jako skrypt:

$ INTFC=eth0  
$ MYIPV4=$(ip -4 -o addr show $INTFC | awk '{print $4}') 
$ echo $MYIPV4
192.168.1.166/24

Dane wyjściowe wytworzone powyżej są zapisane w notacji CIDR. Jeśli notacja CIDR nie jest pożądana, można ją usunąć:

$ ip -4 -o addr show eth0 | awk '{print $4}' | cut -d "/" -f 1 
192.168.1.166  

Inna opcja, że ​​IMHO jest „najbardziej elegancka”, otrzymuje adres IPv4 dla dowolnego interfejsu używanego do łączenia się z określonym zdalnym hostem (w tym przypadku 8.8.8.8). Dzięki uprzejmości @gatoatigrado w tej odpowiedzi :

$ ip route get 8.8.8.8 | awk '{ print $NF; exit }'
192.168.1.166

Jako skrypt:

$ RHOST=8.8.8.8  
$ MYIP=$(ip route get $RHOST | awk '{ print $NF; exit }')
$ echo $MYIP
192.168.1.166

Działa to doskonale na hoście z jednym interfejsem, ale korzystniej działa również na hostach z wieloma interfejsami i / lub specyfikacjami tras.

Chociaż ipbyłoby to moje preferowane podejście, z pewnością nie jest to jedyny sposób na skórowanie tego kota. Oto inne podejście, które stosuje się, hostnamejeśli wolisz coś łatwiejszego / bardziej zwięzłego:

$ hostname --all-ip-addresses | awk '{print $1}'  

Lub jeśli chcesz adres IPv6:

$ hostname --all-ip-addresses | awk '{print $2}'  

Jako skrypt:

$ 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
Seamus
źródło
1

Sugeruję użycie biblioteki Pythona, takiej jak netifaces, która została specjalnie zaprojektowana do tego celu.

sudo pip install netifaces
python -c "import netifaces; print netifaces.ifaddresses('eth0')[netifaces.AF_INET][0]['addr']"

Aby uzyskać domyślny używany interfejs sieciowy.

default_inf = netifaces.gateways()['default'][netifaces.AF_INET][1]
Sandeep
źródło
1

Jeszcze jedna opcja, która może być przydatna, jeśli nie masz awk (jak ma to miejsce w przypadku niektórych urządzeń osadzonych):

ip addr show dev eth0 scope global | grep "inet\b" | cut -d/ -f 1 | egrep -o "([[:digit:]]{1,3}[.]{1}){3}[[:digit:]]{1,3}"
Fulvio Flaco
źródło
1

ifconfig eth0|grep 'inet '|awk '{print $2}'

Maksim Kostromin
źródło
1

oto dla IPv4 :

ip -f inet a|grep -oP "(?<=inet ).+(?=\/)"

oto dla IPv4 i konkretnego dewelopera (eth0):

ip -f inet a show eth0|grep -oP "(?<=inet ).+(?=\/)"

dla IPv6 :

ip -6 -o a|grep -oP "(?<=inet6 ).+(?=\/)"

XXL
źródło
0

można tego używać także u zwykłego użytkownika.

ip addr show eth0 | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
Matheus Baldasso
źródło
poprosić o eth0, ta wersja skryptu może pomóc (również pokazać loopback tho)ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
TiloBunt
To jest prawie taka sama odpowiedź jak askubuntu.com/a/560466/367990 , wystarczy użyć cutdwa razy zamiast kombinacji awki cutdo parsowania wyniku. Następnym razem lepiej najpierw sprawdź wszystkie inne odpowiedzi i upewnij się, że nie opublikujesz duplikatu rozwiązania. W tym przypadku myślę, że jest dyskusyjne, czy jest to duplikat, czy po prostu podobny, więc weź to jako ogólną wskazówkę. Dzięki.
Bajt Dowódca
0

To jest najkrótsza droga, jaką mogłem znaleźć:

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

Zamień $1na interfejs sieciowy.

ip -f inet każe ip zwracać tylko wartości dla rodziny inet (ipv4).

grep -Po mówi grepowi, aby interpretuje następną wartość jako perl-regex i wypisuje tylko pasujące wartości.

Wyrażenie regularne \K[\d.]+mówi „wyrzuć wszystko do tego punktu (\ K) i dopasuj jak najwięcej wartości liczbowych, a następnie kropkę w rzędzie, jak to możliwe”. Dlatego dopasuje tylko adres IP i zignoruje wszystko po nim, w tym krótką maskę podsieci \ XX.

Ryan
źródło
0

w dzisiejszych czasach z wieloma interfejsami (np. jeśli używasz dokera) i interfejs nazewnictwa ETH nie jest już normą

Używam tego polecenia do wyodrębnienia adresu IP / maski:

IPMASK=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6)

Bez względu na to, ile interfejsów będę mieć i jak będą się nazywać, GREP pobierze tylko pierwszego z opcją MULTICAST.

Używam tego polecenia, aby wyodrębnić tylko adres IP bez maski:

IP=$(ip a s|grep -A8 -m1 MULTICAST|grep -m1 inet|cut -d' ' -f6|cut -d'/' -f1)

Używam tych poleceń na różnych systemach BDS i NIX, które nigdy nie zawodzą;)

JOduMonT
źródło
Jeśli zamierzasz przeanalizować dane wyjściowe ip, użyj -oopcji.
muru
0

W moim skrypcie używam czegoś takiego:

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

Nie spawnuje żadnego procesu.

Maciej Wawrzyńczuk
źródło
0

Jeszcze inny sposób (zakładając, że nie chcesz CIDRadresu i chcesz IPv4):

$ ip -br -4 addr show dev eth0 | awk '{split($3,a,"/"); print a[1]}'
  • Wykorzystuje ip polecenia, które nie jestdeprecated
  • Używa tylko jednego polecenia do filtrowania
htaccess
źródło