Commenti
Risposta
Per elencare tutti gli indirizzi IP, indipendentemente dal nome, prova questo:
ifconfig | perl -nle "s/dr:(\S+)/print $1/e"
o:
ifconfig | awk "/inet addr/{print substr($2,6)}"
Specifica il nome dellinterfaccia (ad es. eth0) subito dopo ifconfig
se desideri solo lIP di uninterfaccia specifica:
ifconfig eth0 | perl -nle "s/dr:(\S+)/print $1/e"
o:
ifconfig eth0 | awk "/inet addr/{print substr($2,6)}"
Commenti
- grazie, questo è il mio output 192.168.56.102 10.192.1.218 10.0.2.15 127.0.0.1, ora voglio prendere 10.192.1.218 e assegnarlo in una nuova variabile nello script di shell. come possiamo fare?
- questo visualizzerebbe solo gli indirizzi IP .. sarebbe meglio se i nomi delle interfacce corrispondenti come
eth0
,eth1
, … vengono visualizzati anche. 🙂 - Usa assolutamente le tabelle di routing come suggerisce @ymattw! Questo ha la meravigliosa proprietà di restituire esattamente lindirizzo attraverso il quale il tuo computer è configurato per parlare allindirizzo dato. Penso che probabilmente vorrai
awk '{print $NF; exit}'
, tuttavia, ottenere lultimo campo (indirizzo di origine) della prima riga. - Grazie per averlo sottolineato, sembra il mio ultimo la modifica non è stata ' salvata. Interessante, non potevo ' modificare la mia risposta, quindi ripubblicare semplicemente:
ip route get 1.1.1.1 | awk '{print $NF; exit}
# questo ottiene lip dellinterfaccia che può raggiungere esterno
Risposta
Puoi fare:
ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/"
che fornisce il primo indirizzo IP privato elencato in ip addr
.
Ad esempio, con ip addr
, ottengo:
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
Con la riga di comando precedente, ottengo 192.168.0.85
che è lindirizzo IP di em1
.
Per inserirlo in una variabile allinterno di uno script di shell, puoi eseguire var=$(ip addr | grep "state UP" -A2 | tail -n1 | awk "{print $2}" | cut -f1 -d"/")
. Ora, fino alla fine dello script, $var
avrà il valore dellindirizzo IP.
Commenti
- In effetti, ' è molto simile a unix.stackexchange.com/questions/8518/… . Non ho cercato duplicati prima di inviare …
- ip addr | grep ' state UP ' -A2 | tail -n1 | awk ' {print $ 2} ' | cut -f1 -d ' / ' utilizzando questo comando ho ottenuto un indirizzo privato. Ora voglio assegnare loutput a una variabile
- @rajcoumar Ho aggiornato la risposta. Nota che questa domanda era già stata posta e risposta su questo sito. Vedi unix.stackexchange.com/questions/4569/… per i dettagli.
- Nota anche che la mia risposta non è delle più eleganti. Potrebbe esserci un modo migliore per farlo piuttosto che analizzare loutput di
ip addr
. -
ip addr | grep 'state UP' -A2 | tail -n1 | awk -F'[/ ]+' '{print $3}'
anche questo funziona, a proposito
Risposta
Copia incolla flagrante da stackoverflow dato che non possiamo “ingannare tra i siti. So che non è bash o sh, ma chi non ha Python installato a questo punto?
Dovresti usare netifaces . È progettato per essere multipiattaforma su Mac OS X, Linux e 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"
I numeri utilizzati per indicizzare i protocolli provengono da /usr/include/linux/socket.h
(in Linux) …
#define AF_INET 2 /* Internet IP Protocol */ #define AF_INET6 10 /* IP version 6 */ #define AF_PACKET 17 /* Packet family */
Fine copia incolla
Se tutto quello che vuoi è lIP del interfaccia in uscita, questo funziona.
Eppure UNALTRA opzione se vuoi solo enumerare le interfacce, dal momento che nessuno sembra essere in grado di sotto tand esattamente quello che vuoi:
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
Commenti
- Nota che lOP ha dichiarato nella sua domanda che non ' sa in anticipo quale interfaccia è UP.Vuole solo lindirizzo IP dellinterfaccia nello stato " up " senza sapere quale sia.
- Quindi ' sta solo ottenendo lindirizzo locale da un socket aperto a Google. Per come lho letto, voleva enumerare tutte le interfacce e mappare gli IP alle interfacce invece di aprire semplicemente un socket e cercare lIP locale.
- Aggiunto un semplice script per indirizzare il " dammi solo lIP in uscita " problema.
- Non ' t desidera il suo indirizzo esterno ma il suo indirizzo privato. Per come la vedo io, potrebbe essere connesso a una rete privata da una qualsiasi delle sue interfacce e vuole solo conoscere il suo indirizzo IP privato senza sapere quale interfaccia viene utilizzata.
- Lindirizzo privato sarebbe comunque fornito da il secondo script, ' è solo lindirizzo privato in uscita.
ifconfig -a
cosa ' stai cercando?ifconfig -a
. In effetti la risposta che hai contrassegnato come accettata fa proprio questo (utilizza soloip
invece diifconfig
).ip -4 route get 8.8.8.8 | awk {'print $7'} | tr -d '\n'
MY_IP=$(getent hosts $(hostname) | awk '{print $1}')