Python: получить шлюз по умолчанию для локального интерфейса / IP-адреса в Linux - PullRequest
11 голосов
/ 04 мая 2010

В Linux, как я могу найти шлюз по умолчанию для локального IP-адреса / интерфейса с использованием python?

Я видел вопрос «Как получить внутренний IP, внешний IP и шлюз по умолчанию для UPnP», но в принятом решении показано, как получить локальный IP-адрес для сетевого интерфейса в Windows.

Спасибо.

Ответы [ 7 ]

26 голосов
/ 02 июля 2011

Для тех людей, которые не хотят дополнительной зависимости и не любят вызывать подпроцессы, вот как вы делаете это самостоятельно, читая /proc/net/route напрямую:

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)))

У меня нет машины с прямым порядком байтов для тестирования, поэтому я не уверен, зависит ли порядковый номер от вашей архитектуры процессора, но если это так, замените < в struct.pack('<L', ... на = так что код будет использовать машинный порядок байтов.

11 голосов
/ 04 июня 2014

Для полноты (и для расширения ответа Аластера), вот пример, который использует "netifaces" (протестировано в Ubuntu 10.04, но это должно быть переносимо):

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

Документация для 'netifaces': https://pypi.python.org/pypi/netifaces/

6 голосов
/ 04 мая 2010

Кажется, http://pypi.python.org/pypi/pynetinfo/0.1.9 может это сделать, но я не проверял.

3 голосов
/ 11 мая 2014

Последняя версия netifaces может сделать это тоже, но в отличие от pynetinfo, она будет работать на системах, отличных от Linux (включая Windows, OS X, FreeBSD и Solaris).

0 голосов
/ 18 ноября 2018

вот мое решение получить шлюз по умолчанию для Mac и Linux с python:

import subprocess
import re
import platform

def get_default_gateway_and_interface():
    if platform.system() == "Darwin":
        route_default_result = subprocess.check_output(["route", "get", "default"])
        gateway = re.search(r"\d{1,3}.\d{1,3}.\d{1,3}.\d{1,3}", route_default_result).group(0)
        default_interface = re.search(r"(?:interface:.)(.*)", route_default_result).group(1)

    elif platform.system() == "Linux":
        route_default_result = re.findall(r"([\w.][\w.]*'?\w?)", subprocess.check_output(["ip", "route"]))
        gateway = route_default_result[2]
        default_interface = route_default_result[4]

    if route_default_result:
        return(gateway, default_interface)
    else:
        print("(x) Could not read default routes.")

gateway, default_interface = get_default_gateway_and_interface()
print(gateway)
0 голосов
/ 12 ноября 2017

Вы можете получить это так (протестировано на python 2.7 и Mac OS X Capitain, но должно работать и на GNU / Linux): подпроцесс импорта

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()
0 голосов
/ 16 апреля 2011
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...