2010-03-02 10 views
11

Contesto: Su sistemi * nix, si può ottenere l'indirizzo IP della macchina in uno script di shell in questo modo:modo efficiente per ottenere il vostro indirizzo IP negli script di shell

ifconfig | grep 'inet' | grep -v '127.0.0.1' | cut -d: -f2 | awk '{print $1}' 

O in questo modo anche :

ifconfig | grep 'inet' | grep -v '127.0.0.1' | awk '{print $2}' | sed 's/addr://' 

domanda: ci sarebbe un più semplice, ancora portatile, modo per ottenere l'indirizzo IP per l'utilizzo in uno script di shell?

(my apologies to *BSD and Solaris users as the above command may not work, non ho potuto testare)

+2

Che cosa succede se la macchina ha più di una scheda di rete? –

+1

Cosa intendi con "l'indirizzo IP"? È molto comune in questi giorni avere due o più indirizzi IP, anche su una workstation ... –

+0

Sì, ho pensato a questo problema. Ma dipende da ciò che gli script devono fare. Per le mie esigenze individuali, di solito passo il nome dell'interfaccia a ifconfig (ad esempio 'ifconfig eth0', ecc.). Pensavo che avrebbe reso la domanda troppo specifica. Qualche suggerimento su come rendere la domanda più significativa allora? Grazie! –

risposta

12

puoi farlo con un solo comando awk. Non c'è bisogno di usare troppi tubi.

$ ifconfig | awk -F':' '/inet addr/&&!/127.0.0.1/{split($2,_," ");print _[1]}' 
+0

+1, ma gli spazi bianchi non sono in pericolo: usa di più –

+0

La tua proposta è molto bella. Test semplici mostrano che è anche più veloce in media delle mie proposte di base. Vorrei accettare il tuo per ora. La portabilità tuttavia non è migliore, a causa di '_ [1]' e '$ 2'. Per esempio, ho bisogno di cambiare gli indici sotto * BSD (ah, potrebbe testarlo questa volta). Onestamente, mi chiedo ancora se ci sia uno strumento per ottenere l'IP in un unico colpo, magari passando i parametri (ad esempio il nome dell'interfaccia). 'ifconfig' è infatti per" configurare i parametri dell'interfaccia di rete ", non ottenere parametri ... Forse una versione molto diffusa di' showip.c', come introdotto da Tom, sarebbe ottima. –

+1

se si desidera considerare la portabilità, si potrebbe voler provare a utilizzare una libreria di socket dai vari strumenti di programmazione disponibili, come Perl o Python. es. In Python, si può ottenere l'indirizzo IP usando 'socket.gethostbyname (socket.gethostname())'. Ovviamente questo è solo un semplice esempio. Molte persone hanno escogitato metodi indipendenti dalla piattaforma per elencare l'indirizzo dell'interfaccia usando queste librerie. quindi potresti voler fare un tentativo. – ghostdog74

5

darvi interfaccia diretta riducendo in tal modo uno grep.

ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{print $1}' 
+0

Grazie a @coder per il suggerimento. Mi chiedo se non possiamo andare ancora oltre! Dopotutto gli strumenti * nix fanno qualcosa di semplice e lo fanno bene. Quindi potrebbe esserci un modo standard per ottenere l'indirizzo IP di un'interfaccia. Ad esempio, qualcosa come 'hostname --ip-address' (questo non funziona) sarebbe fantastico. –

+0

'ifconfig eth0 | grep inet | cut -d: -f2 | cut -d '' -f1' - in questo modo si elimina l'awk pesante. Ovviamente non funzionerà con ppp0, ecc., Ma se hai più di una scheda NIC otterresti più di una risposta con la tua soluzione. (testa -1 per afferrare prima?) –

+0

Ha funzionato, e più breve di altre risposte. – Quanlong

1

Guardate qui alla guida del Beej per networking per ottenere la lista dei socket utilizzando un semplice programma C per stampare gli indirizzi IP utilizzando getaddrinfo(...) chiamata. Questo semplice programma C può essere utilizzato in parte dello script della shell per stampare solo gli indirizzi IP disponibili a stdout, operazione che sarebbe più semplice da fare quindi fare affidamento sullo ifconfig se si desidera rimanere portatili in quanto l'output di ifconfig può variare.

Spero che questo aiuti, Cordiali saluti, Tom.

+0

Grazie Tom per il puntatore; aiuta. Una miniera di informazioni. 'Showip.c' risolve il problema (rimuovendo la formattazione dell'output).Mi chiedo però se ci sia un modo per fare affidamento su strumenti "standard" * nix nelle shell. Per il contesto, sto scrivendo alcuni script che dovrebbero funzionare su * nix e * BSD. Funziona, ma il mio modo non è molto elegante. Usando 'showip.c', avrei bisogno di distribuire il programma insieme allo script, che credo possa essere evitato. –

0

ifconfig | grep 'broadcast \ | Bcast' | awk -F '' {'print $ 2'} | testa -n 1 | sed -e 's/addr: // g'

0

Potrebbe essere utile.

more /etc/hosts | grep `hostname` | awk '{print $1}' 
+0

Sarebbe utile specificare almeno le condizioni in cui pensi che funzioni (sistema operativo, ecc.). Il 'grep' è troppo restrittivo per me (testato su due sistemi operativi, senza successo). –

+0

Ho testato su server AIX. Funziona bene. –

+0

Non ha funzionato su CentOS e Mac OS X. Non so abbastanza sugli standard, ma mi chiedo quanto sia normale il contenuto del file '/ etc/hosts' su tutti i sistemi. –

0
# for bash/linux 
ipaddr(){ 
if="${1:-eth0}" 
result=$(/sbin/ip -o -4 addr show dev "${if}" | sed 's/^.*inet // ; s/\/...*$//') 
printf %s "${result}" 
tty -s && printf "\n" 
} 
2

Basato su this è possibile utilizzare il seguente comando

ip route get 8.8.8.8 | awk 'NR==1 {print $NF}'