2010-03-02 8 views
11

Contexto: En los sistemas * nix, se puede obtener la dirección IP de la máquina en un script de shell de esta manera:manera eficaz de obtener su dirección IP en los scripts

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

O de esta manera también :

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

pregunta: Habría una siendo portable, de manera más sencilla, para obtener la dirección IP para su uso en un script de shell?

(my apologies to *BSD and Solaris users as the above command may not work, no podía probar)

+2

¿Qué pasa si la máquina tiene más de un NIC? –

+1

¿Qué quiere decir con "la dirección IP"? En estos días es muy común tener dos o más direcciones IP, incluso en una estación de trabajo ... –

+0

Sí, pensé en este tema. Pero depende de lo que los guiones necesitan hacer. Para mis necesidades individuales, suelo pasar el nombre de la interfaz a ifconfig (es decir, 'ifconfig eth0', etc.). Pensé que eso haría la pregunta demasiado específica. ¿Alguna sugerencia de cómo hacer que la pregunta sea más significativa? ¡Gracias! –

Respuesta

12

puede hacerlo con solo un comando awk. No es necesario usar demasiados tubos.

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

+1, pero el espacio en blanco no está en peligro: use más –

+0

Su propuesta es muy buena. Las pruebas simples muestran que también es más rápido en promedio que mis propuestas básicas. Me gustaría aceptar la tuya por ahora. Sin embargo, la portabilidad no es mejor, debido a '_ [1]' y '$ 2'. Por ejemplo, necesito cambiar los índices bajo * BSD (ah, podría probarlo esta vez). Honestamente, todavía me pregunto si hay una herramienta para obtener la IP en un solo paso, tal vez pasando los parámetros (por ejemplo, el nombre de la interfaz). 'ifconfig' es sin duda para" configurar los parámetros de la interfaz de red ", no obtener los parámetros ... Tal vez una versión bien extendida de' showip.c', como la introdujo Tom, sería genial. –

+1

si desea considerar la portabilidad, puede intentar usar una biblioteca de socket de las diversas herramientas de programación que existen, como Perl o Python. Por ejemplo, en Python, uno puede obtener la dirección IP usando 'socket.gethostbyname (socket.gethostname())'. Por supuesto, esto es solo un simple ejemplo. Muchas personas han encontrado formas independientes de plataforma para listar la dirección de la interfaz usando estas bibliotecas. por lo que es posible que desee probarlo. – ghostdog74

5

le dan interfaz directa reduciendo de esta manera una grep.

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

Gracias @coder por la sugerencia. Me pregunto si no podemos ir aún más lejos. Después de todo, las herramientas * nix hacen algo simple y lo hacen bien. Entonces, puede haber una forma estándar de obtener la dirección IP de una interfaz. Por ejemplo, algo como 'hostname --ip-address' (esto no funciona) sería genial. –

+0

'ifconfig eth0 | grep inet | cut -d: -f2 | cut -d '' -f1' - de esta manera terminas con awk pesado. Por supuesto, no funcionará con ppp0, etc., pero si tiene más de una NIC, también obtendrá más de una respuesta con su solución. (cabeza -1 para agarrar primero?) –

+0

Funcionó, y más corto que otras respuestas. – Quanlong

1

Mire aquí en la guía del Beej networking para obtener la lista de sockets utilizando un programa simple en C para imprimir las direcciones IP utilizando getaddrinfo(...) llamada. Este sencillo programa C se puede utilizar en parte del script de shell para simplemente imprimir las direcciones IP disponibles en stdout, lo que sería más fácil de hacer que confiar en ifconfig si desea seguir siendo portátil ya que la salida de ifconfig puede variar.

Espero que esto ayude, Saludos cordiales, Tom.

+0

Gracias Tom por el puntero; ayuda Una mina de información. El 'showip.c' soluciona el problema (eliminando el formato de salida).Sin embargo, me pregunto si hay una forma de confiar en las herramientas "estándar" * nix en shells. Para el contexto, estoy escribiendo algunos scripts que se supone que funcionan en * nix y * BSD. Funciona, pero mi camino no es muy elegante. Usando 'showip.c', necesitaría implementar el programa junto con el script, que creo que se puede evitar. –

0

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

0

Puede ser que esto ayude.

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

Ayudaría a especificar al menos las condiciones en las que cree que funciona (sistema operativo, etc.). El 'grep' es demasiado restrictivo para mí (probado en dos sistemas operativos, sin éxito). –

+0

Probé en servidores AIX. Funciona bien. –

+0

No funcionó en CentOS y Mac OS X. No sé lo suficiente sobre estándares, pero me pregunto qué tan regular es el contenido de los archivos '/ etc/hosts' en los sistemas. –

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

Basado en this puede utilizar el siguiente comando

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