В Linux, как я могу найти шлюз по умолчанию для локального IP-адреса/интерфейса с помощью python?
Я увидел вопрос "Как получить внутренний IP-адрес, внешний IP-адрес и шлюз по умолчанию для UPnP", но принятое решение показывает, как получить локальный IP-адрес для сетевого интерфейса в окнах.
Спасибо.
Ответ 1
Для тех людей, которые не хотят дополнительной зависимости и не любят вызывать подпроцессы, вот как вы это сделаете сами, непосредственно прочитав /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', ...
на =
поэтому код будет использовать внутреннюю спецификацию машины.
Ответ 2
Для полноты (и для расширения ответа alastair), вот пример, который использует "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/
Ответ 3
Кажется, http://pypi.python.org/pypi/pynetinfo/0.1.9 может это сделать, но я его не тестировал.
Ответ 4
Последняя версия netifaces
также может сделать это, но в отличие от pynetinfo
она будет работать на системах, отличных от Linux (в том числе Windows, OS X, FreeBSD и Solaris).
Ответ 5
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
Ответ 6
Вы можете получить его так (протестировано с 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()