Próbuję użyć tylko adresu IP (inet) jako parametru w skrypcie, który napisałem.
Czy w terminalu unix można łatwo uzyskać tylko adres IP, zamiast go przeglądać ifconfig
?
shell
unix
ip-address
Mason
źródło
źródło
ip -o address
są znacznie łatwiejsze w użyciu niż dane wyjścioweip address
.Odpowiedzi:
Możesz napisać skrypt, który zwraca tylko adres IP, taki jak:
Dla Maca:
Lub dla systemu Linux
źródło
hostname -i
na moim powraca:::1 127.0.1.1 192.168.1.100
hostname
nie jest przenośne.W ten sposób otrzymasz wszystkie interfejsy IPv4, w tym pętlę zwrotną 127.0.0.1:
To pokaże tylko
eth0
:W ten sposób możesz uzyskać adresy IPv6:
Tylko
eth0
IPv6:źródło
grep -oP
Nie na BusyBox v1.24.1: nieprawidłową opcję - P-P
przełącznika dla wyrażeń regularnych Perla, w przeciwnym razie nie możemy użyć(?<=inet\s)
tokenu lookbehind . Podobny wynik uzyskasz biegającgrep -oe 'inet [0-9\.]\+'
albogrep -oe 'inet6 [0-9a-f:]\+'
ale w ten sposób nie mogę pozbyć się pierwszego słowa. Wman grep
raportach SuSE ta-P
flaga jest eksperymentalna.ip -4 a show eth0 | grep -Po 'inet \K[0-9.]*'
Ogólnie rzecz biorąc, nigdy nie ma gwarancji, że system będzie miał tylko jeden adres IP, na przykład możesz mieć zarówno połączenie Ethernet, jak i WLAN, a jeśli masz aktywne połączenie VPN, będziesz mieć kolejny adres IP.
Linux
W systemie Linux
hostname -I
wyświetli bieżące adresy IP. Poleganie na tym, że zawsze zwraca tylko jeden adres IP, najprawdopodobniej nie zadziała zgodnie z oczekiwaniami w niektórych scenariuszach (np. Łącze VPN działa), więc bardziej niezawodnym sposobem byłoby przekonwertowanie wyniku na tablicę, a następnie zapętlenie elementów:OSX
Na OSX, jeśli znasz interfejs , możesz użyć:
który zwróci tylko adres IP.
Lub możesz zapętlić możliwe nazwy interfejsów, zaczynając od sufiksu, np .
en
:Ponadto uzyskanie adresu IP staje się niedeterministyczne w przypadku ustanowienia zarówno połączenia kablowego, jak i Wi-Fi, gdy maszyna ma więcej niż jeden interfejs Ethernet lub gdy obecne są tunele VPN.
Uzyskanie zewnętrznego adresu IP
Jeśli potrzebujesz zewnętrznego adresu IP, możesz wysłać zapytanie do usługi w trybie tekstowym, na przykład
curl https://ipecho.net/plain
zwróci zewnętrzny adres IP w postaci zwykłego tekstu .Jeszcze szybszym sposobem uzyskania zewnętrznego adresu IP jest wysłanie zapytania do znanego serwera DNS:
źródło
To polecenie da ci dokładny adres IP, jaki chcesz w Ubuntu.
źródło
W najnowszych wersjach Ubuntu ( 14.04 - 16.04 ) to polecenie załatwiło sprawę .
źródło
print $1
może, ale nie musi, dać prawidłowy wynik.Jeśli masz ograniczone środowisko, możesz użyć tego polecenia:
źródło
ip -o -4 addr show dev eth0 | cut -d' ' -f7 | cut -d'/' -f1
ip -4 addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1
. Zarówno dla wersji 4, jak i 6:ip addr show eth0 | grep inet | awk '{print $2}' | cut -d'/' -f1
ip -4 addr show eth0 | grep inet
wykonać:ip -4 addr show | grep 192
Aby uzyskać tylko adres IP w systemie Mac OS X , możesz wpisać następujące polecenie:
źródło
Polecenie
ifconfig
zostało usunięte i powinieneś go używaćip
w systemie Linux.Zapewnia również
ip a
zakres w tej samej linii co IP, dzięki czemu jest łatwiejszy w użyciu.To polecenie pokaże ci twój globalny (zewnętrzny) adres IP:
Wszystkie IPv4 (także 127.0.0.1):
Wszystkie IPv6 (także :: 1):
źródło
Możemy po prostu użyć tylko 2 poleceń (ifconfig + awk), aby uzyskać tylko adres IP (v4), który chcemy:
W systemie Linux, zakładając uzyskanie adresu IP z
eth0
interfejsu, uruchom następujące polecenie:W systemie OSX, zakładając uzyskanie adresu IP z
en0
interfejsu, uruchom następujące polecenie:Aby poznać nasz publiczny / zewnętrzny adres IP, dodaj tę funkcję w
~/.bashrc
Następnie uruchomić,
whatismyip
źródło
Aby wydrukować tylko adres IP
eth0
, bez innego tekstu:Aby określić główny interfejs (ponieważ może to nie być „eth0”), użyj:
Powyższe dwie linie można połączyć w jedno polecenie, na przykład:
źródło
Chciałem czegoś prostego, które działałoby jak alias Bash. Okazało się, że
hostname -I
działa najlepiej dla mnie (nazwa hosta v3.15).hostname -i
z jakiegoś powodu zwraca adres IP pętli zwrotnej, alehostname -I
podaje mi poprawny adres IP dla wlan0 i bez konieczności przesyłania danych potokiem przez grep lub awk. Wadą jest to, żehostname -I
wyświetlają wszystkie adresy IP, jeśli masz więcej niż jeden.źródło
To załatwiłoby sprawę na komputerze Mac:
To rozwiązało się
ping 192.168.1.2
w mojej maszynie.Wskazówka dla profesjonalistów :
$(...)
oznacza uruchomienie wszystkiego, co znajduje się w nawiasach w podpowłoce i zwrócenie tego jako wartości.źródło
W
man hostname
tym jest jeszcze prostszy sposób, który automatycznie wyklucza IP pętli zwrotnej i wyświetla tylko listę rozdzielonych spacjami wszystkich przypisanych do adresów IP hostów:źródło
Możesz również użyć następującego polecenia:
UWAGA: zadziała to tylko wtedy, gdy masz połączenie z Internetem.
źródło
Kilka odpowiedzi wydają się być przy użyciu nowszej
ip
polecenia (zastępczegoifconfig
), więc tutaj jest jeden, który używaip addr
,grep
iawk
po prostu wydrukować adres IPv4 związany zwlan0
interfejsem:Chociaż nie jest to najbardziej kompaktowe ani wymyślne rozwiązanie, jest (prawdopodobnie) łatwe do zrozumienia (patrz wyjaśnienie poniżej) i zmodyfikowania do innych celów, takich jak pobranie ostatnich 3 oktetów adresu MAC, takich jak ten:
Objaśnienie:
ip addr show wlan0
wyświetla informacje powiązane z wymienionym interfejsem sieciowymwlan0
, które powinny być podobne do następującego:Następnie
grep inet
odfiltrowuje wiersze, które nie zawierają „inet” (konfiguracja IPv4 i IPv6) igrep -v inet6
odfiltrowuje pozostałe wiersze, które zawierają „inet6”, co powinno dać w wyniku pojedynczy wiersz taki jak ten:Na koniec pierwsza
awk
wyodrębnia pole „172.18.18.1/24”, a druga usuwa skrót maski sieci, pozostawiając tylko adres IPv4.Myślę też, że warto wspomnieć, że jeśli tworzysz skrypty, często istnieje wiele bogatszych i / lub solidniejszych narzędzi do uzyskiwania tych informacji, których możesz chcieć użyć. Na przykład, jeśli używasz Node.js
ipaddr-linux
, jeśli używasz Rubiegolinux-ip-parser
, itd.Zobacz też /unix/119269/how-to-get-ip-address-using-shell-script
źródło
Użyj następującego polecenia:
źródło
Oto moja wersja, w której możesz przekazać listę interfejsów uporządkowanych według priorytetu:
Więc jeśli jestem połączony przez VPN, Wi-Fi i Ethernet, mój adres VPN (na interfejsie tap0) zostanie zwrócony. Skrypt działa zarówno na Linuksie, jak i na OSX i może przyjmować argumenty, jeśli chcesz przesłonić IFLIST
Zauważ, że jeśli chcesz używać IPV6, musisz zamienić „inet” na „inet6”.
źródło
Zawsze potrzebuję tego w najbardziej nieoczekiwanych momentach i bez wątpienia szukam takich wątków w SO. Napisałem więc prosty skrypt do pobierania adresów IPv4 przez netstat, nazwany
echoip
- możesz go znaleźć tutaj . Bash dla adresów sieciowych wygląda następująco, pobiera również Twój adres publiczny z ipecho.net:echoip
Skrypt daje wyjście takiego:źródło
użyj tego skryptu
ifconfig | grep "inet " | grep -v 127.0.0.1|awk 'match($0, /([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/) {print substr($0,RSTART,RLENGTH)}'
jednowierszowego : Mac i linux (testowane w systemie Ubuntu) działają.źródło
ifconfig en0
lubifconfig eth1
itp., Jeśli znasz interfejs, który chcesz :)Wolę nie używać
awk
i takie w skryptach ..ip
ma opcję wyprowadzania w JSON.Jeśli opuścisz,
$interface
otrzymasz wszystkie adresy IP:źródło
bash ip -j addr show eth0 | jp "[0].addr_info[?family== 'inet'].local | [0]"
pokazuje wszystkie twoje adresy IP
źródło
Na Redhat 64bit ten problem rozwiązał za mnie.
źródło
źródło
Podczas wyszukiwania zewnętrznego adresu IP na hoście z NAT, wiele odpowiedzi sugeruje użycie metod opartych na HTTP, takich jak
ifconfig.me
np:Przez lata widziałem, jak wiele z tych witryn pojawia się i znika, uważam, że ta metoda oparta na DNS jest bardziej niezawodna:
Mam ten poręczny alias w moim
~/.bashrc
:źródło
Te dwa sposoby zadziałały dla mnie:
Aby uzyskać adres IP interfejsu, eth0. Zastąp eth0 w poniższym przykładzie nazwą swojego interfejsu.
ifconfig eth0 | grep -w "inet" | tr -s " " | cut -f3 -d" "
Używanie nazwy hosta: To da ci inet, czyli adres IP twojego etosu. używając -Podam ci wartość inet wszystkich interfejsów, gdziekolwiek ta wartość jest obecna.
hostname -i
źródło
Zwraca tylko adres IP twojego systemu.
źródło
Użyłbym,
Hostname -L
aby uzyskać tylko adres IP, który ma być używany jako zmienna w skrypcie.źródło
hostname -i
lubhostname -I
?user@linux:~$ Hostname -L -bash: Hostname: command not found user@linux:~$
1. KapitałH
jest zły 2. Nie ma takiego-L