Wyświetlanie adresu IP na interfejsie eth0


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ź


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)

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.


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ć.


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.


@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


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

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]


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}"


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 ).+(?=\/)"


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

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.


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ą;)


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.