Jak mogę wyświetlić adres IP pokazany na eth0 za pomocą skryptu?
24
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ź
grep "inet"
Aby zapewnić inną opcję, możesz użyć
ip addr
polecenia w ten sposób, aby uzyskać adres IP:ip addr show eth0
pokazuje informacje oeth0
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 / mask172.20.20.15/25
cut -d/ -f1
zajmuje tylko część adresu IP.W skrypcie:
źródło
Zaczerpnięte z /programming//a/14910952/1695680
Może to jednak zwrócić lokalny adres IP (127.0.0.1), więc może być konieczne użycie i filtrowanie:
Na stronach podręcznych nazwy hosta:
źródło
ip addr show label 'enp*'
ip addr show label 'enp*' | grep -oP inet\ \\S+ | cut -d' ' -f2
Odpowiedź Markusa-Lindberga jest moją ulubioną. Jeśli dodasz
-o -4
do flag ip, to uzyskasz dużo łatwiejsze do parsowania (i spójne) wyjście:-o
oznacza--oneline
, co ma pomóc w dokładnie takich sytuacjach.-4
Jest dodawana do limitu na adres IPv4, który jest co wszystkie inne odpowiedzi sugerować.źródło
ip
flagi. Używaniecut
zamiast zaawansowanegoawk
czarodziejstwa:ip -o -4 addr show eth0 scope global | awk '{print $4;}' | cut -d/ -f 1
cut
sposób po tym, jak się dowiedziałemawk
i lubię minimalizować liczbę poleceń w moich potokach. W każdym razie miła sugestia.Oto kilka onelinerów .....
Awk
funkcja split w powyższej komendzie awk dzieli drugą kolumnę na podstawie separatora
:
i zapisuje podzieloną wartość w tablicy asocjacyjneja
. Taka[2]
utrzymuje wartość drugiej części.sed
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
\K
odrzuca poprzednio dopasowane znaki z wydruku na końcu i\S+
dopasowuje jeden lub więcej znaków spacji.Perl
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.źródło
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
źródło
Powinieneś używać
ip
(zamiastifconfig
), 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
:Jako skrypt:
Dane wyjściowe wytworzone powyżej są zapisane w notacji CIDR. Jeśli notacja CIDR nie jest pożądana, można ją usunąć:
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 :
Jako skrypt:
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ż
ip
był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ę,hostname
jeśli wolisz coś łatwiejszego / bardziej zwięzłego:Lub jeśli chcesz adres IPv6:
Jako skrypt:
źródło
Sugeruję użycie biblioteki Pythona, takiej jak netifaces, która została specjalnie zaprojektowana do tego celu.
Aby uzyskać domyślny używany interfejs sieciowy.
źródło
To jedyne zastosowanie,
ip addr
które jest zamiennikiemifconfig
iawk
połączone z podstawieniem (gsub).Przestań używać zbyt wielu procesów do prostych zadań
źródło
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):
źródło
ifconfig eth0|grep 'inet '|awk '{print $2}'
źródło
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 ).+(?=\/)"
źródło
można tego używać także u zwykłego użytkownika.
źródło
ip addr show | grep "inet " | cut -d '/' -f1 | cut -d ' ' -f6
cut
dwa razy zamiast kombinacjiawk
icut
do 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.To jest najkrótsza droga, jaką mogłem znaleźć:
ip -f inet addr show $1 | grep -Po 'inet \K[\d.]+'
Zamień
$1
na 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.źródło
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:
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:
Używam tych poleceń na różnych systemach BDS i NIX, które nigdy nie zawodzą;)
źródło
ip
, użyj-o
opcji.W moim skrypcie używam czegoś takiego:
Nie spawnuje żadnego procesu.
źródło
Jeszcze inny sposób (zakładając, że nie chcesz
CIDR
adresu i chceszIPv4
):ip
polecenia, które nie jestdeprecated
źródło