IFF_PROMISC
açmak için bir istek yayımlamak için bir AF_NETLINK
soketi kullanın. Python Linux üzerinde AF_NETLINK
yuvalarına inşa edebilirsiniz:
>>> from socket import AF_NETLINK, SOCK_DGRAM, socket
>>> s = socket(AF_NETLINK, SOCK_DGRAM)
>>>
bir netlink isteği nasıl bir örnek için Netlink (7) kılavuz sayfasını sonundaki örneğe bakın. Netlink soketine göndermek için serileştirilmiş nlmsghdr mesajını oluşturmak için
ctypes
(veya
struct
) kullanabilirsiniz. Ayrıca,
Python still doesn't expose these APIs'dan beri
sendmsg
ve
recvmsg
numaralarını aramanız gerekebilir. Alternatif olarak, bu iki API'yi ortaya çıkaran bazı
third-party modules mevcuttur.
Alternatif olarak, ioctl
'u kullanarak eski okul yoluna gidebilir ve bu da ne yazık ki daha basittir.
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
Sonra/usr/dışına birkaç sabit değerleri kopyalamak beri şunlardır: Sonra ioctl
çağrı ile kullanmak için bir soket yapmak
import ctypes
class ifreq(ctypes.Structure):
_fields_ = [("ifr_ifrn", ctypes.c_char * 16),
("ifr_flags", ctypes.c_short)]
:
İlk ctypes kullanarak ifreq yapısını tanımlamak onlar Python tarafından maruz değiliz:
IFF_PROMISC = 0x100
SIOCGIFFLAGS = 0x8913
SIOCSIFFLAGS = 0x8914
bir Instan oluştur
import fcntl
fcntl.ioctl(s.fileno(), SIOCGIFFLAGS, ifr) # G for Get
: Zaten arabirimde ayarlanır neyse bayraklar zarar vermiyorum böylece
ifr = ifreq()
ifr.ifr_ifrn = "eth4"
bir ioctl
çağrıyla ifr_flags
alanını doldur: ifreq yapının ce ve onu doldurmak istenen etkiye sahip arabirimde bayrakları
ifr.ifr_flags |= IFF_PROMISC
Ve ayarlayın::
gelenle bayrağı ekle
fcntl.ioctl(s.fileno(), SIOCSIFFLAGS, ifr) # S for Set
, bayrağı kaldırmak onu maske ve yeniden ayarlamak için:
ifr.ifr_flags &= ~IFF_PROMISC
fcntl.ioctl(s.fileno(), SIOCSIFFLAGS, ifr)
Rasgele mod kullanmak için Linux'ta kök izinlerine ihtiyacınız vardır. –
Kök izinleri vardı ancak hatırlattığınız için teşekkürler :) – TanB