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 utilizandoroute
parece más apropiado.0 votos
Tal vez me interese un
ifconfig
método ya que acabo de descubrir que miroute
ruta ;-) no funciona en High Sierra1 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?0 votos
He adaptado la pregunta para que sea más clara
0 votos
He eliminado las interfaces inactivas/irrelevantes y sólo he dejado las activas. Lo primero que puedo ver es que tienes una configuración multi-homed con WiFi y Ethernet ambos conectados a la misma red - esto no es ideal. Si estás conectado a través de Ethernet, apaga el WiFi. No hay ninguna razón para tener ambos conectados simultáneamente.
0 votos
Todavía estoy tratando de averiguar si intenta determinar si cualquier IP (es decir, cualquier IP de cualquier parte del mundo) se enruta a través de una interfaz particular o si resulta que está en una red particular.
0 votos
No, eso es ideal. Básicamente, si el enlace ethernet se rompe, el sistema recurre a la siguiente interfaz, que es Wifi. Esta es una configuración normal, especialmente en los portátiles que pueden ser cualquiera de los dos. Normalmente, tengo el Wifi apagado en los ordenadores de sobremesa (de hecho: no es necesario), pero para las pruebas quiero tener ambos activos. En un mundo perfecto, ambos serían la misma dirección IP y el tráfico podría utilizar ambos, pero crear tales configuraciones vinculadas es demasiado complejo y probablemente no funciona en la mayoría de los casos de todos modos.
0 votos
No intento hacer ninguna de las dos cosas. Quiero saber si una determinada IP es "yo". Porque si no es 'yo' necesito hacer algo en mi script y si es 'yo' necesito hacer otra cosa. Así que en mi ejemplo, si le doy a mi script la dirección IP 192.168.1.13 tengo que hacer una cosa y si le doy 192.168.1.10 o 192.168.1.11 tengo que hacer otra cosa.
0 votos
Para la biblioteca de Python, véase pypi.org/project/netifaces o pythonhosted.org/ifaddr
0 votos
Así que básicamente puedes ejecutar
ifconfig | fgrep IP
, si encuentra una coincidencia la dirección es local.0 votos
Pruebe
sudo netstat -anp tcp
le proporcionará una columna llamadaLocal Address
con sus direcciones locales reales, como puede suponer.sudo lsof -Pn -i4
te dará aún más detalles, aunque no es lo que pediste puede ser útil.0 votos
@igor-voltaic ambos no informan de una interfaz activa pero no predeterminada. Es decir, 192.168.1.10 es ethernet (por defecto) y 192.168.1.11 es Wifi (secundaria). 192.168.1.11 es una dirección local para mi uso, pero no se encontrará con su
netstat
olsof
comandos.ifconfig
con grep funciona.0 votos
@gctwnl tienes razón sobre
lsof
pero la afirmación no es cierta paranetstat
intentarnetstat -i
.