使用一個AF_NETLINK
套接字發出請求打開IFF_PROMISC
。 Python可以在Linux構造AF_NETLINK
插口:
>>> from socket import AF_NETLINK, SOCK_DGRAM, socket
>>> s = socket(AF_NETLINK, SOCK_DGRAM)
>>>
參見例如在網絡鏈路(7)手冊頁面的末尾有關如何發出網絡鏈路請求的示例。您可以使用(或甚至struct
)構建序列化的nlmsghdr消息通過netlink套接字發送。您可能還需要撥打電話sendmsg
和recvmsg
,因爲Python still doesn't expose these APIs。或者,有一些third-party modules可用,它們暴露這兩個API。
另外,你可以去舊的路線使用ioctl
,這可悲的是事實證明是相當簡單。
import ctypes
class ifreq(ctypes.Structure):
_fields_ = [("ifr_ifrn", ctypes.c_char * 16),
("ifr_flags", ctypes.c_short)]
然後做一個插座與ioctl
呼叫使用:
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
然後複製一對夫婦常量值出在/ usr /因爲包括
首先使用ctypes的定義爲ifreq結構它們沒有被Python公開:
IFF_PROMISC = 0x100
SIOCGIFFLAGS = 0x8913
SIOCSIFFLAGS = 0x8914
創建一個instan爲ifreq結構的CE和填充它有預期的效果:
ifr = ifreq()
ifr.ifr_ifrn = "eth4"
填充有ioctl
調用ifr_flags
場,這樣你就不會破壞任何標誌已經設置界面:
import fcntl
fcntl.ioctl(s.fileno(), SIOCGIFFLAGS, ifr) # G for Get
加入混雜標記:
ifr.ifr_flags |= IFF_PROMISC
,並設置標誌的接口上:
fcntl.ioctl(s.fileno(), SIOCSIFFLAGS, ifr) # S for Set
要刪除標誌,屏蔽它,然後再重新設置:
ifr.ifr_flags &= ~IFF_PROMISC
fcntl.ioctl(s.fileno(), SIOCSIFFLAGS, ifr)
您需要Linux上的root權限才能使用混雜模式。 – 2011-05-20 04:27:26
我有根權限,但感謝提醒:) – TanB 2011-05-22 21:44:42