traduccion script example bash networking scripting ip tcp

example - bash scripting



Encuentra la dirección IP interna con BASH (4)

Ya conozco muchas formas de obtener su IP interna (ifconfig, ip addr, / etc / hosts, etc.), pero estoy tratando de escribir un script bash que siempre devuelva la IP interna. El problema es que muchos one-liners (/ sbin / ifconfig | grep inet | head -1 | sed ''s / /: / /'' | awk ''{print $ 3}'') pueden devolver varias direcciones IP, y necesito distinguir el interno uno manualmente.

Sospecho que para la computadora, no hay diferencia entre una IP externa y una IP interna, y por lo tanto no hay una forma 100% garantizada de obtener la IP correcta.

El resultado final es que este script devolverá el IP interno, sin importar si es una dirección 192 o 204, etc.

Gracias por adelantado.


" hostname -i " debería darle el mismo resultado


Dentro de los espacios de direcciones privados RFC 1918 , una máquina podría tener todas las direcciones en el rango 10/8 , el rango 172.16/12 y el rango 192.168/16 , para un total de 17891328 direcciones IP, y todas ellas serían legales IPs "internas".

Oh, sí, no olvide IPv6 :) 2 ^ 64 direcciones posibles por red para una sola máquina, que podría participar en múltiples redes.

Esto tampoco es exactamente académico: es bastante común que los sistemas host VMWare, VirtualBox, QEMU, etc. tengan asignadas múltiples direcciones RFC 1918; uno para el ''uso habitual'', y otro que se usa específicamente para comunicarse con los sistemas operativos invitados. O enrutadores / firewalls, pueden tener una docena de direcciones IP internas específicamente para subredes de una red por razones de control de acceso.


Sin embargo, los sistemas también pueden tener múltiples IP privadas. Tendría que limitar su búsqueda de IP a IP privadas. 10.0.0.0/8, 172.16.0.0/12 y 192.168.0.0/16.


Como otros han mencionado, una máquina no está realmente garantizada, o incluso es probable que tenga una sola dirección IP. No estoy seguro exactamente a qué te refieres con "IP interna"; a veces esto puede significar "dirección IP en la red local", es decir, la interfaz que se conecta a un firewall habilitado para NAT.

Estoy pensando que la mejor manera de hacerlo es conectarse a un host en la red que desea y usar la dirección desde la cual se origina esa conexión. Esta será la interfaz que la máquina normalmente usa para conectarse a esa red. El usuario Unkwntech tenía la misma idea en este hilo . El código a continuación solo está tomado de esa respuesta.

No sé si esto realmente califica como una solución "bash", ya que es solo una secuencia de comandos de Python en línea, pero de todos modos esto le dará la dirección IP local utilizada para llegar a google.com . Por lo tanto, esto le dará la dirección IP de la interfaz que utilice la máquina para llegar a los servidores de Internet.

$ python -c ''import socket s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.connect(("google.com", 80)) print s.getsockname()[0]''

Una solución más bash-y podría usar tracepath o alguna utilidad similar.