Сетевой интерфейс для сырых сокетов в python? - PullRequest
1 голос
/ 05 февраля 2012

Я пишу небольшую утилиту для настройки беспроводного моста в Python, используя необработанные сокеты с Ethernet II proto 0x8888.Существует несколько руководств по необработанным сокетам для python, но все они, кажется, жестко кодируют сетевой интерфейс («eth0», «eth1» и т. Д.), Чего я не хочу, потому что у каждого компьютера может быть свой сетевой интерфейс(на моем ноутбуке это "wlan0").

Мой текущий рабочий код (к сожалению, с жестко закодированным "wlan0"):

# Create an Ethernet II broadcast of ethertype 0x8888:
s = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, 0x8888)
s.bind(("wlan0",0x8888))
ifName,ifProto,pktType,hwType,hwAddr = s.getsockname()
txFrame = struct.pack("!6s6sH","\xFF\xFF\xFF\xFF\xFF\xFF",hwAddr,0x8888) + "\x00"*0x32
# Send and wait for response
s.send(txFrame)

Есть ли способ получить имя сетевого интерфейса натекущая система вместо того, чтобы жестко ее кодировать?

Я пробовал INADDR_ANY, но это тоже не работает.

1 Ответ

0 голосов
/ 05 февраля 2012

Вы можете использовать подпроцесс и re, чтобы получить список сетевых интерфейсов:

import subprocess, re

config = subprocess.check_output("ifconfig")
expr = re.compile("([a-zA-Z0-9]+)\s+Link")
interfaces = expr.findall(config)

ifconfig также имеет опции, которые позволяют вам видеть «отключенные» интерфейсы, хотя я не думаю, что вам нужноих, если вы хотите транслировать.Подробнее см. man ifconfig.

...