2010-05-03 13 views
11

Su Linux, come posso trovare il gateway predefinito per un indirizzo IP/interfaccia locale usando python?Python: get gateway predefinito per un'interfaccia locale/indirizzo IP in linux

Ho visto la domanda "Come ottenere IP interno, IP esterno e gateway predefinito per UPnP", ma la soluzione accettata mostra solo come ottenere l'indirizzo IP locale per un'interfaccia di rete su Windows.

Grazie.

+0

è potrebbe usare python per eseguire il comando 'route' del sistema e quindi elaborare l'output per ottenere il gateway predefinito. Potrebbe esserci anche un flag per il percorso per stampare solo quello. Non conosco un modo simile a un pitone. In bocca al lupo. –

risposta

21

Per coloro che non vogliono una dipendenza in più e non amano chiamare sottoprocessi, ecco come lo fate voi stessi leggendo /proc/net/route direttamente:

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: 
       continue 

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

non ho un macchina big-endian per testare, quindi non sono sicuro se il endianness dipende dall'architettura del processore, ma se lo è, sostituire lo < in struct.pack('<L', ... con = in modo che il codice utilizzi l'endianness nativa della macchina.

5

Sembra che lo sia http://pypi.python.org/pypi/pynetinfo/0.1.9, ma non l'ho provato.

+1

Quella libreria è fantastica! Ha un metodo netinfo.get_routes che restituisce una tupla di dizionari contenenti esattamente i dati di cui avevo bisogno. Grazie! – GnP

0
def get_ip(): 
    file=os.popen("ifconfig | grep 'addr:'") 
    data=file.read() 
    file.close() 
    bits=data.strip().split('\n') 
    addresses=[] 
    for bit in bits: 
     if bit.strip().startswith("inet "): 
      other_bits=bit.replace(':', ' ').strip().split(' ') 
      for obit in other_bits: 
       if (obit.count('.')==3): 
        if not obit.startswith("127."): 
         addresses.append(obit) 
        break 
    return addresses 
3

L'ultima versione di netifaces può fare anche questo, ma a differenza di pynetinfo, funzionerà su sistemi diversi da Linux (inclusi Windows, OS X, FreeBSD e Solaris).

9

Per completezza (e per espandere la risposta di Alastair), ecco un esempio che usa "netifaces" (testato sotto Ubuntu 10.04, ma questo dovrebbe essere portabile):

$ 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' 

documentazione relativa a 'netifaces': https://pypi.python.org/pypi/netifaces/

+0

Questo funziona per osx! Grazie mille! –

-1

è possibile ottenere in questo modo (testato con python 2.7 e Mac OS X Capitain ma dovrebbe funzionare su GNU/Linux): import sottoprocesso

def system_call(command): 
    p = subprocess.Popen([command], stdout=subprocess.PIPE, shell=True) 
    return p.stdout.read() 


def get_gateway_address(): 
    return system_call("route -n get default | grep 'gateway' | awk '{print $2}'") 

print get_gateway_address() 
Problemi correlati