0 votos

¿Cómo puedo averiguar (línea de comandos o Python) si una dirección IP es del host local?

Estoy ejecutando MacOS High Sierra y Mojave.

Me gustaría poder averiguar (para un script de Python) si alguna dirección IP es de la máquina local o de otra máquina. La máquina local puede tener múltiples direcciones IP (como una para ethernet y otra para wifi) que ambas están activas en la máquina local (aunque sólo una se use para conectarse a la LAN).

He encontrado una manera, route get <ip-address> mostrará interfaz: lo0 en la salida para cualquier dirección IP que sea de una interfaz del host local.

Ruta por defecto (ethernet):

hermione:~ gerben$ route get 192.168.1.10
   route to: hermione
destination: hermione
  interface: lo0
      flags: <UP,HOST,DONE,LLINFO,WASCLONED,LOCAL,IFSCOPE,IFREF>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0         0         0         0         0     16384         0 

La otra dirección ip (Wifi, no la ruta por defecto cuando se conecta ethernet) en este host:

hermione:~ gerben$ route get 192.168.1.11
   route to: 192.168.1.11
destination: 192.168.1.11
  interface: lo0
      flags: <UP,HOST,DONE,LLINFO,WASCLONED,LOCAL,IFSCOPE,IFREF>
 recvpipe  sendpipe  ssthresh  rtt,msec    rttvar  hopcount      mtu     expire
       0         0         0         0         0         0     16384         0 

No sé lo fiable que es, pero podría analizarlo. Actualización: esto sólo funciona en Mojave, High Sierra no informará que es local.

¿Existe una forma mejor de determinar si una dirección IP aleatoria se encuentra en una interfaz local? ¿Una que funcione en más versiones de MacOS?

Preferiblemente directamente en Python 3, para no tener que ejecutar comandos externos y analizar su salida en Python.

A petición de @Allan, la salida de ifconfig (Mojave)

lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
    options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
    inet 127.0.0.1 netmask 0xff000000 
    inet6 ::1 prefixlen 128 
    inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1 
    nd6 options=201<PERFORMNUD,DAD>

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=10b<RXCSUM,TXCSUM,VLAN_HWTAGGING,AV>
    ether f0:18:98:ed:f6:45 
    inet6 fe80::1040:443f:fe24:97e8%en0 prefixlen 64 secured scopeid 0x8 
    inet 192.168.1.10 netmask 0xffffff00 broadcast 192.168.1.255
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect (1000baseT <full-duplex,flow-control>)
    status: active
en9: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether ac:de:48:00:11:22 
    inet6 fe80::aede:48ff:fe00:1122%en9 prefixlen 64 scopeid 0x9 
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect (100baseTX <full-duplex>)
    status: active

en1: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether f0:18:98:b6:d3:d0 
    inet 192.168.1.11 netmask 0xffffff00 broadcast 192.168.1.255
    media: autoselect
    status: active

awdl0: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1484
    ether 12:69:24:84:fd:9a 
    inet6 fe80::1069:24ff:fe84:fd9a%awdl0 prefixlen 64 scopeid 0xd 
    nd6 options=201<PERFORMNUD,DAD>
    media: autoselect
    status: active

vboxnet0: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 0a:00:27:00:00:00 
vboxnet1: flags=8842<BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    ether 0a:00:27:00:00:01 
vboxnet2: flags=8943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST> mtu 1500
    ether 0a:00:27:00:00:02 
    inet 192.168.97.1 netmask 0xffffff00 broadcast 192.168.97.255

Puedo egrep 'init.*192\.168\.1\.11' para obtener las direcciones IP de las interfaces de este host.

0 votos

También puede analizar la salida de ifconfig pero utilizando route parece más apropiado.

0 votos

Tal vez me interese un ifconfig método ya que acabo de descubrir que mi route ruta ;-) no funciona en High Sierra

1 votos

lo0 es su interfaz de bucle de retorno. Es una pseudo-interfaz creada por el sistema por lo que será local pase lo que pase. He leído esta pregunta varias veces y parece que estás preguntando para determinar si cualquier una dirección IP determinada está en la subred local o no. ¿Es esto correcto?

2voto

Craig Stodolenak Puntos 31

Ya he tenido que resolver esto para algunos clientes en el pasado. El método más fácil y fiable para todas las versiones del sistema operativo que he encontrado es la comparación de las líneas inet en los resultados de ifconfig.

0voto

Igor Voltaic Puntos 76

netstat es la herramienta destinada a ello.

netstat -i mostrará sus interfaces y las IPs asociadas a ellas

aquí está el enlace con más ejemplos y man netstat por supuesto, lo siguiente que hay que leer para obtener más detalles.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X