¿Hay alguna manera fácil de extraer mediante progtwigción la dirección IP?

¿Existe alguna forma fácil de extraer mediante progtwigción la dirección IP sin tedioso análisis de ifconfig ? No me importaría el simple procesamiento de salida de command utilizando sed para hacerlo, pero no procesar files de varias líneas desde /etc algún lugar. Lo que bash hacer es modificar mi .bashrc para mostrar la dirección IP del host en el post de saludo. Estoy usando Ubuntu 12.04 pero decidí publicar aquí en lugar del foro de Ubuntu porque considero que esto no es específico de la distribución.

NOTAS

  1. Controles del dispositivo NIC

    Los siguientes ejemplos suponen que la interfaz de networking es una tarjeta inalámbrica llamada wlan0 . Ajuste este bit en los ejemplos para su situación particular. Por ejemplo, si se trata de una tarjeta de NIC con cable, entonces es probable que sea eth0 .

  2. IPv4 – (Protocolo de Internet versión 4)

    También estos ejemplos devuelven la dirección IPv4. el "quad punteado" que la mayoría de las personas identifica como su "Dirección IP".

    Por ejemplo:

     inet addr:192.168.1.20 Bcast:192.168.1.255 Mask:255.255.255.0 
  3. IPv6 – (Protocolo de Internet versión 6)

    Si su sistema está configurado para admitir IPv6, verá tanto el "quad punteado" como las direcciones IP de IPv6 en la salida ifconfig .

    Por ejemplo:

     inet6 addr: fe80::226:c7ff:fe85:a720/64 Scope:Link 

    Los commands a continuación ignoran esto explícitamente, pero podrían adaptarse bastante fácilmente para captar esta información.

Soluciones (usando ifconfig )

Hay muchas maneras de hacer esto. Por ejemplo, podría utilizar este script awk para analizar la dirección IP de su NIC LAN inalámbrica (wlan0):

 $ ifconfig wlan0 | grep "inet " | awk -F'[: ]+' '{ print $4 }' 192.168.1.20 

Puede hacer esto y hacerlo más compacto:

 $ ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}' 192.168.1.20 

También podrías hacerlo usando perl :

 $ ifconfig wlan0 | perl -nle'/t addr:(\S+)/&&print$1' 192.168.1.20 

El ejemplo de Perl es casi tan compacto como puede getse.

Hay innumerables otras forms de hacerlo, estos son solo algunos ejemplos para comenzar.

EDIT # 1

Algunas notas y comentarios adicionales. @StephaneChazelas demostró que hay una versión aún más compacta que usa grep :

 $ ifconfig wlan0|grep -Po 't addr:\K[\d.]+' 192.168.1.20 

Esta solución hace uso de la capacidad de grep en versiones más nuevas para hacer uso de PCRE (expresiones regulares de Perl), junto con su interruptor -o para devolver exactamente lo que coincide con la expresión regular.

Soluciones (usando ip )

Como también se mencionó en los comentarios, ifconfig puede ser problemático para usar en sistemas que tienen múltiples direcciones IP asignadas a un dispositivo de networking, dado que solo devuelve el primero. Entonces es mejor usar el command ip en estas situaciones.

Por ejemplo:

 $ ip addr show wlan0 | grep -Po 'inet \K[\d.]+' 192.168.1.20 

También puede indicar a ip que solo muestre la información de IPv4 para una interfaz de networking determinada. En este caso, solo estamos mirando la interfaz llamada wlan0 :

 $ ip -f inet addr show wlan0 | grep -Po 'inet \K[\d.]+' 192.168.1.20 

Referencias

  • Golfing la extracción de direcciones IP de ifconfig
  • página de manual de ip
  • Página de manual de ifconfig
  • Página de manual de PCRE
  • página de manual grep

$ hostname -I

Por ejemplo:

 $ hostname -I 192.168.1.18 

Info. de páginas de manual:

http://manpages.ubuntu.com/manpages/raring/en/man1/hostname.1.html
http://unixhelp.ed.ac.uk/CGI/man-cgi?hostname

Aquí hay otra que usa "ip", pero funciona mejor cuando su dispositivo puede estar conectado con diferentes interfaces, como Ethernet con cable a veces y WiFi otras veces. También usé "sed" en lugar de "grep" o "perl", por variedad.

Esto encuentra cualquier fuente IP que tenga una ruta a Internet. O al DNS de Google en cualquier caso.

 ip -o route get 8.8.8.8 | sed -e 's/^.* src \([^ ]*\) .*$/\1/'