Вопрос или проблема
В моем скрипте на Python мне нужно получить как IP-адрес машины, на которой выполняется скрипт, так и ее сетевой адрес и сетевые байты.
Что касается IP-адреса, я нашел решение в архиве:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("www.google.com",80))
myAddress = (s.getsockname()[0])
s.close()
Но как мне найти сетевой адрес и сетевые байты? Мне нужно поместить эту информацию в фильтр для tcpdump в формате $NetworkAddress/$NetworkBytes
, если это поможет.
Пример:
128.1.2.0/20
Я на самом деле могу найти это под inet
, когда запускаю ip addr
. Есть ли простой способ получить эту информацию в Python?
Для Linux попробуйте
iface = "eth0"
socket.inet_ntoa(fcntl.ioctl(socket.socket(socket.AF_INET, socket.SOCK_DGRAM),
35099, struct.pack('256s', iface))[20:24])
или http://github.com/rlisagor/pynetlinux
(как предложено здесь: Получение сетевой маски в Python)
Для Linux, Windows и MacOS рассмотрите http://alastairs-place.net/projects/netifaces/
Обновление:
Если вам нужен cidr (например, ‘128.1.2.0/20’), вы можете использовать любую из связанных библиотек: http://pypi.python.org/pypi?%3Aaction=search&term=cidr&submit=search
Например, netaddr
:
>> from netaddr import IPNetwork
>> print str(IPNetwork('1.2.3.4/255.255.255.0').cidr)
1.2.3.0/24
Вы можете получить любую информацию, связанную с ip, с помощью модуля pyroute2:
from pyroute2 import IPDB
ip = IPDB()
print(ip.interfaces['em1'].ipaddr)
ip.release()
Или как вариант:
from pyroute2 import IPRoute
ip = IPRoute()
info = [{'iface': x['index'],
'addr': x.get_attr('IFA_ADDRESS'),
'mask': x['prefixlen']} for x in ip.get_addr()]
ip.close()
Ответ или решение
Для решения задачи получения сетевого адреса и сетевой маски в Python можно воспользоваться несколькими методами, в зависимости от операционной системы и доступных библиотек. Ниже представлены подробные шаги, позволяющие реализовать данную функциональность.
Шаг 1: Получение IP-адреса локальной машины
Вы уже предоставили код, который позволяет получить IP-адрес вашего компьютера. Давайте его немного модифицируем:
import socket
def get_ip_address():
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
s.connect(("www.google.com", 80))
ip_address = s.getsockname()[0]
s.close()
return ip_address
Шаг 2: Получение сетевой маски и сетевого адреса
Для получения сетевой маски и сетевого адреса можно воспользоваться библиотеками netifaces
или pyroute2
. Ниже я покажу, как это сделать с использованием обеих библиотек. Если у вас их нет, установите их с помощью:
pip install netifaces pyroute2
Вариант 1: Использование netifaces
import netifaces
def get_network_info(interface='eth0'):
addrs = netifaces.ifaddresses(interface)
ip_addr = addrs[netifaces.AF_INET][0]['addr']
netmask = addrs[netifaces.AF_INET][0]['netmask']
return ip_addr, netmask
# Пример использования
ip, mask = get_network_info()
print(f"IP: {ip}, Netmask: {mask}")
Вариант 2: Использование pyroute2
from pyroute2 import IPDB
def get_network_info_pyroute2():
with IPDB() as ipdb:
for iface in ipdb.interfaces:
if ipdb.interfaces[iface].ipaddr:
ip_addr = ipdb.interfaces[iface].ipaddr[0]
prefixlen = ipdb.interfaces[iface].prefixlen[0]
print(f"Interface: {iface}, IP: {ip_addr}, Prefix Length: {prefixlen}")
# Пример использования
get_network_info_pyroute2()
Шаг 3: Форматирование сети в CIDR
Чтобы преобразовать сетевой адрес и маску в формат CIDR, можно воспользоваться библиотекой ipaddress
, которая встроена в стандартную библиотеку Python (начиная с версии 3.3):
import ipaddress
def format_cidr(ip, netmask):
network = ipaddress.ip_network(f"{ip}/{netmask}", strict=False)
return str(network)
# Пример использования
ip, mask = get_network_info()
cidr_format = format_cidr(ip, mask)
print(f"CIDR Format: {cidr_format}")
Заключение
Теперь у вас есть полный код, который осуществляет следующие действия:
- Получает IP-адрес локальной машины.
- Получает сетевую маску.
- Форматирует сетевой адрес в формате CIDR.
Эта функциональность может быть интегрирована в ваш существующий скрипт для фильтров tcpdump
. Используйте полученные данные в формате NetworkAddress/NetworkBytes
, как показано в примере:
print(f"Filter for tcpdump: {cidr_format}")
Следуя этим шагам, вы сможете быстро и эффективно получить нужные сетевые данные с использованием Python.