Saltar al contenido

Python: obtenga la puerta de enlace predeterminada para una interfaz local / dirección IP en linux

Solución:

Para aquellas personas que no quieren una dependencia adicional y no les gusta llamar a subprocesos, así es como puede hacerlo usted mismo leyendo /proc/net/route directamente:

import socket, struct

def get_default_gateway_linux():
    """Read the default gateway directly from /proc."""
    with open("/proc/net/route") as fh:
        for line in fh:
            fields = line.strip().split()
            if fields[1] != '00000000' or not int(fields[3], 16) & 2:
                # If not default route or not RTF_GATEWAY, skip it
                continue

            return socket.inet_ntoa(struct.pack("<L", int(fields[2], 16)))

No tengo una máquina big-endian para probar, por lo que no estoy seguro de si la endianidad depende de la arquitectura de su procesador, pero si es así, reemplace el < en struct.pack('<L', ... con = por lo que el código utilizará el endianness nativo de la máquina.

Para completar (y ampliar la respuesta de alastair), aquí hay un ejemplo que usa “netifaces” (probado en Ubuntu 10.04, pero debería ser portátil):

$ sudo easy_install netifaces
Python 2.6.5 (r265:79063, Oct  1 2012, 22:04:36)
...
$ ipython
...
In [8]: import netifaces
In [9]: gws=netifaces.gateways()
In [10]: gws
Out[10]:
{2: [('192.168.0.254', 'eth0', True)],
 'default': {2: ('192.168.0.254', 'eth0')}}
In [11]: gws['default'][netifaces.AF_INET][0]
Out[11]: '192.168.0.254'

Documentación para ‘netifaces’: https://pypi.python.org/pypi/netifaces/

Parece que http://pypi.python.org/pypi/pynetinfo/0.1.9 puede hacer esto, pero no lo he probado.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *