Как получить имена сетевых интерфейсов в Python?
Я совершенно новичок в программировании на питоне, поэтому, пожалуйста, будьте терпеливы со мной.
В любом случае, чтобы получить имена карт NIC в машине и т.д. eth0, lo? Если да, то как вы это делаете?
Я исследовал, но до сих пор я только нашел коды для получения IP-адресов и MAC-адресов, таких как
import socket
socket.gethostbyname(socket.gethostname())
Совет по кодам действительно будет оценен. Спасибо!
Ответы
Ответ 1
Я не думаю, что в этой стандартной библиотеке ничего нет, чтобы запрашивать эти имена.
Если мне нужны эти имена в системе Linux, я бы проанализировал вывод ifconfig
или содержимое /proc/net/dev
. Посмотрите на эту запись в блоге для аналогичной проблемы.
Ответ 2
В Linux вы можете просто перечислить ссылки в /sys/class/net/by
os.listdir('/sys/class/net/')
Не уверен, что это работает во всех дистрибутивах.
Ответ 3
Отличная библиотека Python, которую я использовал для этого, - это psutil. Он может использоваться в Linux, Windows и OSX среди других платформ и поддерживается с Python 2.6 до 3.6.
Psutil предоставляет функцию net_if_addrs(), которая возвращает словарь, в котором ключами являются имена сетевых карт, а значением является список именованных кортежей для каждого адреса, назначенного сетевой карте, который включает в себя семейство адресов, адрес сетевой карты, маску сети, широковещательный адрес и адрес назначения.
Простой пример использования net_if_addrs()
который выведет список Python с именами net_if_addrs()
:
import psutil
addrs = psutil.net_if_addrs()
print(addrs.keys())
Ответ 4
Так как этот ответ появляется в Google, когда я ищу эту информацию, я думал, что должен добавить свой метод для получения доступных интерфейсов (а также IP-адресов). Очень приятный модуль netifaces заботится об этом, переносимым образом.
Ответ 5
Используя python ctypes
, вы можете сделать вызов функции библиотеки C getifaddrs
:
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from ctypes import *
class Sockaddr(Structure):
_fields_ = [('sa_family', c_ushort), ('sa_data', c_char * 14)]
class Ifa_Ifu(Union):
_fields_ = [('ifu_broadaddr', POINTER(Sockaddr)),
('ifu_dstaddr', POINTER(Sockaddr))]
class Ifaddrs(Structure):
pass
Ifaddrs._fields_ = [('ifa_next', POINTER(Ifaddrs)), ('ifa_name', c_char_p),
('ifa_flags', c_uint), ('ifa_addr', POINTER(Sockaddr)),
('ifa_netmask', POINTER(Sockaddr)), ('ifa_ifu', Ifa_Ifu),
('ifa_data', c_void_p)]
def get_interfaces():
libc = CDLL('libc.so.6')
libc.getifaddrs.restype = c_int
ifaddr_p = pointer(Ifaddrs())
ret = libc.getifaddrs(pointer((ifaddr_p)))
interfaces = set()
head = ifaddr_p
while ifaddr_p:
interfaces.add(ifaddr_p.contents.ifa_name)
ifaddr_p = ifaddr_p.contents.ifa_next
libc.freeifaddrs(head)
return interfaces
if __name__ == "__main__":
print(get_interfaces())
Обратите внимание, что этот метод не переносится.
Ответ 6
Чтобы добавить к тому, что упоминает @Kristian Evensen, вот что я использовал для проблемы, которую я имел.
Если вы хотите просто получить список интерфейсов, используйте:
interface_list = netifaces.interfaces()
Если вам нужен конкретный интерфейс, но не знаете, что число в конце (то есть: eth0), используйте:
interface_list = netifaces.interfaces()
interface = filter(lambda x: 'eth' in x,interface_list)
Ответ 7
Как говорит Дэвид Брейер, вы можете просто перечислить каталог "/sys/class/net" в Linux. (По крайней мере, он работает на Fedora). Если вам нужна подробная информация о каком-то интерфейсе, вы можете перемещаться по каталогам intefaces для более подробной информации.
def getAllInterfaces():
return os.listdir('/sys/class/net/')
Ответ 8
Есть пакет python get-nic, который дает статус NIC, up\down, ip addr, mac addr и т.д.
pip install get-nic
from get_nic import getnic
getnic.interfaces()
Output: ["eth0", "wlo1"]
interfaces = getnic.interfaces()
getnic.ipaddr(interfaces)
Output:
{'lo': {'state': 'UNKNOWN', 'inet4': '127.0.0.1/8', 'inet6': '::1/128'}, 'enp3s0': {'state': 'DOWN', 'HWaddr': 'a4:5d:36:c2:34:3e'}, 'wlo1': {'state': 'UP', 'HWaddr': '48:d2:24:7f:63:10', 'inet4': '10.16.1.34/24', 'inet6': 'fe80::ab4a:95f7:26bd:82dd/64'}}
Обратитесь к странице GitHub для получения дополнительной информации: https://github.com/tech-novic/get-nic-details
Ответ 9
Модуль socket
в Python> = 3.3:
import socket
# Return a list of network interface information
socket.if_nameindex()
https://docs.python.org/3/library/socket.html#socket.if_nameindex