Szukam rozwiązania wiersza polecenia, które zwróciłoby mi podstawowy (pierwszy) adres IP hosta lokalnego, inny niż 127.0.0.1
Rozwiązanie powinno działać przynajmniej w systemie Linux (Debian i RedHat) i OS X 10.7+
Wiem, że ifconfig
jest dostępny na obu, ale jego wyniki nie są tak spójne między tymi platformami.
curl -4 ifconfig.co
. Odpowie na Twój zewnętrzny adres IP4.Odpowiedzi:
Służy
grep
do filtrowania adresu IP zifconfig
:ifconfig | grep -Eo 'inet (addr:)?([0-9]*\.){3}[0-9]*' | grep -Eo '([0-9]*\.){3}[0-9]*' | grep -v '127.0.0.1'
Lub z
sed
:ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'
Jeśli interesują Cię tylko niektóre interfejsy, wlan0, eth0 itp., To:
ifconfig wlan0 | ...
Możesz dokonać aliasu polecenia w swoim,
.bashrc
aby utworzyć własne polecenie,myip
na przykład o nazwie .alias myip="ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p'"
Znacznie prostszym sposobem jest
hostname -I
(hostname -i
dla starszych wersji,hostname
ale patrz komentarze). Jest to jednak tylko w systemie Linux.źródło
-E
opcji Extended RE, a nie-r
opcji w stylu GNU .-E
. Najnowsze wersje FreeBSD dodały-r
opcję jako alias-E
ułatwiającą przenoszenie skryptu, ale aktualizacja nie została jeszcze przeniesiona do OSX, który ostatnio sprawdziłem nadal używa wersji sed z wydania FreeBSD sprzed kilku lat. Nie jestem pewien, który dokładnie, ponieważ OSX kilka lat przyjmował kod źródłowy FreeBSD. Uważam, że stosowanie-E
miało być porównywalny dogrep
„s-E
opcja. Nie mam pojęcia, dlaczego ludzie GNU zdecydowali się na to-r
.-E
aby mieć pewność przenośności, pomyślałbyś, że--help
iman pages
zostanie zaktualizowana .. to spowodowało lekkie zamieszanie dla mnie wcześniej w innym pytaniu przy użyciu-E
Następujące będą działać w systemie Linux, ale nie OSX.
To w ogóle nie opiera się na DNS i działa, nawet jeśli
/etc/hosts
nie jest ustawione poprawnie (1
jest skrótem1.0.0.0
):lub unikanie
awk
publicznego DNS-u Google i korzystanie z niego8.8.8.8
dla oczywistości:Mniej niezawodny sposób: (patrz komentarz poniżej)
źródło
hostname -I
jest niewiarygodna, ponieważ (zgodnie z dokumentacją) nie można przyjmować żadnych założeń dotyczących kolejności adresów. Więc może to być jakaś sieć wewnętrzna (na przykład sieć, w której żyją maszyny wirtualne). Druga metoda wydaje się dobra.ip route get 1 | awk '{print $(NF-2);exit}'
działa, gdy dołączam UID do outptutip route get 1 | sed -n 's/^.*src \([0-9.]*\) .*$/\1/p'
W przypadku maszyn linuxowych (nie OS X):
źródło
hostname -i
jest równoważną krótką formąhostname
w GNU Coreutils w wersji 8.26.hostname -i
daje tylko lokalny adres IP, ahostname -I
wszystkie pozostałe adresy IPw systemie Linux
na macOS
hostname -I
może zwrócić wiele adresów w niewiarygodnej kolejności (patrz stronahostname
podręcznika ), ale dla mnie to po prostu zwraca192.168.1.X
, czego właśnie chciałeś.źródło
hostname -i
z niższym I.-i
flaga mówi w ten sposób:Avoid using this option; use hostname -I instead
.Rozwiązanie
Wyjaśnienie
Poprawny sposób do informacji o sieci zapytania jest za pomocą
ip
:-o
wyjście jednolinioweroute get to
uzyskać aktualną trasę jądra do miejsca docelowego8.8.8.8
Google IP, ale można użyć prawdziwego adresu IP, który chcesz osiągnąćnp.
ip
wyjście:Aby wyodrębnić
src
ip,sed
jest najlepszym i najbardziej kompatybilnym z obsługą wyrażeń regularnych:-n
brak danych wyjściowych domyślnie's/pattern/replacement/p'
dopasuj tylko wzór i zamień druk.*src \([0-9.]\+\).*
dopasuj adres IP src używany przez jądro, aby osiągnąć8.8.8.8
np. końcowy wynik:
Inne odpowiedzi
Myślę, że żadna z powyższych odpowiedzi nie jest dla mnie wystarczająco dobra, ponieważ nie działają one na najnowszej maszynie (Gentoo 2018).
Problemy znalezione w poprzednich odpowiedziach:
ifconfig
jest przestarzałe i - na przykład - nie podaje wielu adresów IP;awk
do prostego zadania, które sed lepiej sobie poradzi;ip route get 1
jest niejasne i faktycznie jest pseudonimem dlaip route get to 1.0.0.0
hostname
polecenia, które nie mają-I
opcji we wszystkich urządzeniach i które zwracają się127.0.0.1
w moim przypadku.źródło
Edytowane (
2014-06-012018-01-09)Dla silniejszej konfiguracji, z wieloma interfejsami i wieloma adresami IP skonfigurowanymi na każdym interfejsie, napisałem czysty skrypt bash (nie oparty na
127.0.0.1
) w celu znalezienia poprawnego interfejsu i adresu IP, na podstawiedefault route
. Publikuję ten skrypt na samym dole tej odpowiedzi.Wprowadzenie
Jak oba Os grzmotnąć zainstalowana domyślnie, jest wskazówka bash dla komputerów Mac i Linux:
Problemowi ustawień regionalnych zapobiega się poprzez użycie
LANG=C
:Umieszczenie tego w funkcji:
Minimalny:
Proste użycie:
Fantazyjne porządki:
Stosowanie:
lub z uruchomioną tą samą funkcją, ale z argumentem:
Nota: Bez argumentu ta funkcja generuje na STDOUT, adres IP i znak nowej linii , z argumentem nic nie jest drukowane, ale tworzona jest zmienna o nazwie jako argument i zawiera adres IP bez znaku nowego wiersza .
Nota2: Zostało to przetestowane na Debianie, LaCie zhakowała nas i MaxOs. Jeśli to nie zadziała w twoim środowisku, będę bardzo zainteresowany informacjami zwrotnymi!
Starsza wersja tej odpowiedzi
(Nie usunięty, ponieważ oparty na
sed
, niebash
.)Ostrzeżenie: istnieje problem z ustawieniami regionalnymi!
Szybki i mały:
Eksplodował (też działa;)
Edytować:
W jaki sposób! Wygląda na to, że nie działa w systemie Mac OS ...
Ok, wydaje się, że działa to tak samo w systemie Mac OS, jak w moim systemie Linux :
podzielony:
Mój skrypt (styczeń 2018 r.):
Skrypt ten najpierw znajdzie domyślną trasę i interfejs , a następnie wyszuka lokalną sieć IP dopasowującą bramę i zapełni zmienne. Ostatnie dwa wiersze po prostu drukują, coś w stylu:
lub
Cóż, oto:
źródło
sbin
nie ma na mojej$PATH
pełnej ścieżce, należy podać, ale ta sama ścieżka istnieje również w MacOS. :-)time
aby wybrać, którego chcesz używać tak długo ...Dotyczy tylko niektórych wersji Ubuntu. Chociaż może ci to tylko powiedzieć
127.0.0.1
:lub
źródło
$ hostname --ip-address
po prostu daje mi127.0.0.1
Arch ArchMożesz również uzyskać adres IP w wersji 4 adresu eth0, używając tego polecenia w systemie Linux
Wyjście będzie takie
źródło
Działa to w systemach Linux i OSX
Spowoduje to powiązanie interfejsu z domyślną trasą
Korzystając z interfejsu odkrytego powyżej, uzyskaj adres IP.
OSX
Darwin laptop 14.4.0 Darwin Kernel Wersja 14.4.0: Czw 28 maja 11:35:04 PDT 2015; root: xnu-2782.30.5 ~ 1 / RELEASE_X86_64 x86_64
en5
192.168.0.130
CentOS Linux
Linux dev-cil.medfx.local 2.6.18-164.el5xen 1 SMP czw. Wrz 3 04:03:03 EDT 2009 x86_64 x86_64 x86_64 GNU / Linux
eth0
192.168.46.10
źródło
| head -1
na końcu pierwszego wiersza, aby uzyskać domyślny interfejs, a reszta jest dobra.Korzystanie z niektórych innych metod Możesz wprowadzić konflikt, w którym w systemie jest zdefiniowanych wiele adresów IP. Ta linia zawsze domyślnie używa adresu IP.
źródło
Wyciągam mój komentarz do tej odpowiedzi:
Opiera się na odpowiedzi @CollinAnderson, która nie zadziałała w moim przypadku.
źródło
źródło
bash
alias:alias myip="ifconfig | grep 'inet ' | grep -v '127.0.0.1' | awk '{print \$2}'"
Najkrótszy sposób na uzyskanie lokalnego adresu IPv4 w systemie Linux:
źródło
Zakładając, że potrzebujesz podstawowego publicznego adresu IP takiego, jaki widzi z reszty świata, wypróbuj dowolne z tych:
źródło
Muszę dodać do odpowiedzi Collina Andersona, że ta metoda bierze również pod uwagę, jeśli masz dwa interfejsy i oba są wyświetlane jako aktywne.
Pracowałem nad aplikacją z Raspberry Pi i potrzebowałem adresu IP, który był faktycznie używany, nie tylko czy był włączony czy nie. Większość pozostałych odpowiedzi zwróci oba adresy IP, co niekoniecznie jest pomocne - tak czy inaczej w moim scenariuszu.
źródło
Podstawowy interfejs sieciowy IP
źródło
Znajduje adres IP tego komputera w sieci, która jest bramą domyślną (na przykład wyklucza wszystkie sieci wirtualne, mosty dokerów) np. bramka internetowa, bramka wifi, ethernet
Działa w systemie Linux.
Test:
źródło
źródło
Kolejna
ifconfig
odmiana, która działa zarówno w systemie Linux, jak i OSX:źródło
ifconfig | grep '\<inet\>' | cut -d ' ' -f2 | grep -v '127.0.0.1'
Przejrzałem wiele linków (StackExchange, AskUbuntu, StackOverflow itp.) I podjąłem decyzję o połączeniu wszystkich najlepszych rozwiązań w jednym skrypcie powłoki.
Moim zdaniem te dwa QA są najlepiej widoczne:
Jak mogę uzyskać mój zewnętrzny adres IP w skrypcie powłoki? https://unix.stackexchange.com/q/22615
Jak mogę znaleźć mój wewnętrzny adres IP? https://askubuntu.com/a/604691
Oto moje rozwiązanie oparte na kilku pomysłach rsp udostępnionych w jego repozytorium ( https://github.com/rsp/scripts/ ).
Niektórzy z was mogliby powiedzieć, że ten skrypt jest niezwykle ogromny jak na tak proste zadanie, ale chciałbym, aby korzystanie z niego było jak najbardziej łatwe i elastyczne. Obsługuje prosty plik konfiguracyjny umożliwiający przedefiniowanie wartości domyślnych.
Został pomyślnie przetestowany pod Cygwin, MINGW i Linux (Red Hat).
Pokaż wewnętrzny adres IP
Pokaż zewnętrzny adres IP
Kod źródłowy, również dostępny pod linkiem: https://github.com/ildar-shaimordanov/tea-set/blob/master/home/bin/myip . Przykład pliku konfiguracyjnego znajduje się obok głównego skryptu.
źródło
Używam tylko nazw interfejsów sieciowych , moim niestandardowym poleceniem jest
w moim własnym zeszycie
ale jeśli interfejs sieciowy jest właścicielem co najmniej jednego adresu IP, pokaże, że wszystkie adresy IP należą do niego
na przykład
Ubuntu 16.10
Debian Jessie
CentOS 6.8
Fedora 24
Wygląda na to, że polecenie
ip route get 1 | awk '{print $NF;exit}'
dostarczone przez link jest dokładniejsze, a ponadto krótsze.źródło
Nie jestem pewien, czy to działa we wszystkich systemach operacyjnych, wypróbuj to.
źródło
ip route get 1 | awk '{print $NF;exit}'
. Powinien działać na większości systemów.ip route get 1 | awk '{print $NF;exit}'
działaNa wszystko jest pakiet węzłów. Jest wieloplatformowy i łatwy w użyciu.
Jest to kontrowersyjne podejście, ale stosowanie npm do oprzyrządowania staje się coraz bardziej popularne, czy mu się to podoba, czy nie.
źródło
Jeśli znasz interfejs sieciowy (eth0, wlan, tun0 itp.):
źródło
źródło
źródło
Działa na komputerach Mac, Linux i wewnątrz kontenerów Docker:
$ hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print
1 USD; wyjście}')Działa również
Makefile
jako:LOCAL_HOST := ${shell hostname --ip-address 2> /dev/null || (ifconfig | sed -En 's/127.0.0.1//;s/.*inet (addr:)?(([0-9]*\.){3}[0-9]*).*/\2/p' | awk '{print $1; exit}')}
źródło
hostname --ip-address
=>hostname: illegal option -- -
na macOS SierraW przypadku Linuksa potrzebne jest to polecenie:
wpisz to w swojej powłoce, a po prostu poznasz swój ip.
źródło
Łatwiej to odczytać:
ifconfig | grep 'inet addr:' |/usr/bin/awk '{print $2}' | tr -d addr:
źródło
Jeśli masz
npm
inode
zainstalowałeś:npm install -g ip && node -e "const ip = require('ip'); console.log(ip.address())"
źródło