Come ottenere lindirizzo IP utilizzando lo script di shell? [duplicate]

Questa domanda ha già una risposta qui :

Commenti

  • Isn ' t ifconfig -a cosa ' stai cercando?
  • @rajcoumar Non riesco a capire perché lutilizzo di un IP privato ti impedisce di utilizzare loutput di ifconfig -a. In effetti la risposta che hai contrassegnato come accettata fa proprio questo (utilizza solo ip invece di ifconfig).
  • ip -4 route get 8.8.8.8 | awk {'print $7'} | tr -d '\n'
  • MY_IP=$(getent hosts $(hostname) | awk '{print $1}')

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.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *