Jak získat IP adresu pomocí shell skriptu? [duplicate]

Tato otázka již má odpovědi zde :

Komentáře

  • Není ' t ifconfig -a co ' hledáte?
  • @rajcoumar Nechápu, proč vám používání soukromé adresy IP zakazuje používání výstup ifconfig -a. Ve skutečnosti odpověď, kterou jste označili jako přijatou, dělá právě to (používá pouze ip místo ifconfig).
  • ip -4 route get 8.8.8.8 | awk {'print $7'} | tr -d '\n'
  • MY_IP=$(getent hosts $(hostname) | awk '{print $1}')

odpověď

Chcete-li zobrazit všechny adresy IP bez ohledu na jejich název, zkuste toto:

ifconfig | perl -nle "s/dr:(\S+)/print $1/e" 

nebo:

ifconfig | awk "/inet addr/{print substr($2,6)}" 

Zadejte název rozhraní (např. eth0) hned za ifconfig, pokud chcete pouze adresu IP konkrétního rozhraní:

ifconfig eth0 | perl -nle "s/dr:(\S+)/print $1/e" 

nebo:

ifconfig eth0 | awk "/inet addr/{print substr($2,6)}" 

Komentáře

  • díky, toto je můj výstup 192.168.56.102 10.192.1.218 10.0.2.15 127.0.0.1, nyní chci vzít 10.192.1.218 a přiřadit jej do nové proměnné ve skriptu prostředí. jak to můžeme udělat?
  • které by zobrazovaly pouze adresy IP. bylo by lepší, kdyby odpovídající názvy rozhraní byly eth0, eth1, … jsou zobrazeny také. 🙂
  • Absolutně používejte směrovací tabulky, jak navrhuje @ymattw! To má úžasnou vlastnost vracet přesně adresu, prostřednictvím které je váš počítač nakonfigurován tak, aby na danou adresu mohl mluvit. Myslím, že pravděpodobně chcete awk '{print $NF; exit}' získat poslední pole (zdrojovou adresu) prvního řádku.
  • Děkujeme, že jste upozornili, vypadá jako můj poslední úprava nebyla ' uložena. Zajímavé, nemohl jsem ' upravit svoji vlastní odpověď, takže stačí repost: ip route get 1.1.1.1 | awk '{print $NF; exit} # this získat IP rozhraní, které může dosáhnout mimo

Odpověď

Můžete udělat:

ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"

, která vám poskytne první soukromou IP adresu uvedenou v ip addr.

Například s ip addr dostanu:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: em1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:16:76:de:c1:f1 brd ff:ff:ff:ff:ff:ff inet 192.168.0.85/24 brd 192.168.0.255 scope global dynamic em1 valid_lft 42505sec preferred_lft 42505sec inet6 fe80::216:76ff:fede:c1f1/64 scope link valid_lft forever preferred_lft forever 3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 52:54:00:da:92:d0 brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 500 link/ether 52:54:00:da:92:d0 brd ff:ff:ff:ff:ff:ff 

S příkazovým řádkem dříve dostanu 192.168.0.85 což je IP adresa em1.

Chcete-li ji vložit do proměnné uvnitř skriptu prostředí, můžete udělat var=$(ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"). Až do konce skriptu bude mít $var hodnotu IP adresy.

Komentáře

  • A skutečně je ' velmi podobný unix.stackexchange.com/questions/8518/… . Před zveřejněním jsem nehledal duplikáty …
  • ip addr | grep ' stav UP ' -A2 | ocas -n1 | awk ' {print $ 2} ' | cut -f1 -d ' / ' pomocí tohoto příkazu mám soukromou adresu. Nyní chci přiřadit výstup k proměnné
  • @rajcoumar Aktualizoval jsem odpověď. Tato otázka již byla na tomto webu položena a zodpovězena. Podrobnosti najdete na stránce unix.stackexchange.com/questions/4569/… .
  • Poznámka také to, že moje odpověď není nejelegantnější. Může to být lepší způsob, než analyzovat výstup ip addr.
  • ip addr | grep 'state UP' -A2 | tail -n1 | awk -F'[/ ]+' '{print $3}' to funguje také, mimochodem

odpověď

flagrant copy copy paste from stackoverflow , protože nemůžeme kopírovat napříč weby. Vím, že to není bash nebo sh, ale kdo nemá v tomto okamžiku nainstalovaný python?

Měli byste použít netifaces . Je navržen jako platforma pro Mac   OS   X, Linux a Windows.

>>> import netifaces as ni >>> ni.interfaces() ["lo", "eth0", "eth1", "vboxnet0", "dummy1"] >>> ni.ifaddresses("eth0") {17: [{"broadcast": "ff:ff:ff:ff:ff:ff", "addr": "00:02:55:7b:b2:f6"}], 2: [{"broadcast": "24.19.161.7", "netmask": "255.255.255.248", "addr": "24.19.161.6"}], 10: [{"netmask": "ffff:ffff:ffff:ffff::", "addr": "fe80::202:55ff:fe7b:b2f6%eth0"}]} >>> >>> ni.ifaddresses.__doc__ "Obtain information about the specified network interface.\n\nReturns a dict whose keys are equal to the address family constants,\ne.g. netifaces.AF_INET, and whose values are a list of addresses in\nthat family that are attached to the network interface." >>> # for the IPv4 address of eth0 >>> ni.ifaddresses("eth0")[2][0]["addr"] "24.19.161.6" 

Čísla použitá k indexování protokolů jsou z /usr/include/linux/socket.h (v systému Linux) …

#define AF_INET 2 /* Internet IP Protocol */ #define AF_INET6 10 /* IP version 6 */ #define AF_PACKET 17 /* Packet family */ 

Vložit kopii konce

Pokud chcete pouze IP adresu nahoru a odchozí rozhraní, toto funguje.

Ještě JEDNA možnost, pokud chcete vyjmenovat více rozhraní, protože se zdá, že nikdo není schopen unders řekněte přesně to, co chcete:

import netifaces as ni ints = ni.interfaces() for i in ints: if "eth" in i: try: ni.ifaddresses(i)[2][0]["addr"] print("interface: " + i) print("address: " + ni.ifaddresses(i)[2][0]["addr"]) except: pass elif "wlan" in i: try: ni.ifaddresses(i)[2][0]["addr"] print("interface: " + i) print("address: " + ni.ifaddresses(i)[2][0]["addr"]) except: pass 

Komentáře

  • Všimněte si, že OP ve své otázce uvedl, že předem neví ', které rozhraní je NAHORU.Chce pouze IP adresu rozhraní ve stavu " up ", aniž by věděl, o kterou z nich jde.
  • Pak ' pouze získává místní adresu z otevřené zásuvky do Googlu. Jak jsem to četl, chtěl vyjmenovat všechna rozhraní a namapovat IP na rozhraní, na rozdíl od pouhého otevření zásuvky a hledání místní IP.
  • Přidal jednoduchý skript na adresu " dejte mi odchozí problém s IP ".
  • Nedělá ' t chcete jeho externí adresu, ale jeho soukromou adresu. Jak to chápu, mohl by být připojen k soukromé síti pomocí kteréhokoli ze svých rozhraní a chce jen znát svou soukromou IP adresu, aniž by věděl, které rozhraní se používá.
  • Soukromou adresu by stále uváděl druhý skript, je to ' pouze odchozí soukromá adresa.

Napsat komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *