الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

مشكلة في استخدام scapy

بدأه a.atalla في 9 يونيو 2012 · 1 رد · 672 مشاهدة · في لغة Python
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمة الله وبركاته

بدأت في كتابة أصدار جديد من TuxCut وقررت أستخدام مكتبة Scapy

المكتبة أكثر من رائعة وتقدم تسهيلات ممتازة لأي مدير شبكة , أثناء العمل تواجهني عدة مشاكل لذا سأضع المشاكل هنا لعلي أجد مساعدة

توجد دالة في scapy تسمي arping وهي تقوم بعمل مسح للشبكة المحلية عن طريق arp requests ويمكن أستخدامها بالكود التالي

from scapy.all import arping

def arping_ip(net):
    hosts_dict = {}
    ans,unans = arping(net,timeout=1,verbose=False)
    for s,r in ans.res:
        hosts_dict.setdefault(r.psrc,r.src)
    print hosts_dict

gw_ip = '192.168.1.1'
arping_ip(gw_ip)        # This will get the MAC of the gateway  
arping_ip(gw_ip+'/24')  # This will scan the Whole LAN

هذا الجزء من الكود يعمل بشكل ممتاز وبلا أخطاء ولكن عند أستخدام هذا الكود في داخل كلاس TuxCut تبدأ المشاكل في الظهور

from scapy.all import arping
import subprocess as sp
from PyQt4 import QtCore,QtGui,uic

class TuxCut(QtGui.QMainWindow):
    def __init__(self):
        QtGui.QMainWindow.__init__(self)
        uic.loadUi('ui/MainWindow.ui',self)

        self._gwMAC=None
        self._isProtected = False
        self._isFedora = True

        self._gwIP = self.default_gw()

        if not self._gwIP==None:
            self.arping_ip(self._gwIP)
        else:
            print "You Are not connected to any network"
        self.show_Window()


    def show_Window(self):
        screen = QtGui.QDesktopWidget().screenGeometry()
        size =  self.geometry()
        self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2)

        self.table_hosts.setColumnWidth(0,150)
        self.table_hosts.setColumnWidth(1,150)
        self.table_hosts.setColumnWidth(2,75)
        self.show()


    def default_gw(self):
        args = ['route','list']
        gwip = sp.Popen(['ip','route','list'],stdout = sp.PIPE)
        for line in  gwip.stdout:
            if 'default' in line:
                return  line.split()[2]


    def arping_ip(self, net):
        print net
        hosts_dict = {}
        ans,unans = arping(net,timeout=1,verbose=False)
        for s,r in ans.res:
            hosts_dict.setdefault(r.psrc,r.src)

        print hosts_dict

عند تمرير self._gwIP لدالة arping يعمل الكود ويعيد لي قاموس بقيمة ip و mac للراوتر

root /home/ahmed/Projects/tuxcut #  python tuxcut.py
WARNING: No route found for IPv6 destination :: (no default route?)
192.168.1.1
{'192.168.1.1': 'cd:48:7a:ff:cd:48'}

لكن عند أضافة /24 لـ IP الراوتر لكي يعمل مسح شامل لكل أجهزة الشبكة يأتي Error لا أفهمه

root /home/ahmed/Projects/tuxcut #  python tuxcut.py
WARNING: No route found for IPv6 destination :: (no default route?)
192.168.1.1/24
Traceback (most recent call last):
  File "tuxcut.py", line 7, in <module>
    tux = TuxCut()
  File "/home/ahmed/Projects/tuxcut/TuxCut.py", line 20, in __init__
    self.arping_ip(self._gwIP+'/24')
  File "/home/ahmed/Projects/tuxcut/TuxCut.py", line 48, in arping_ip
    ans,unans = arping(net,timeout=1,verbose=False)
  File "/usr/lib/python2.7/site-packages/scapy/layers/l2.py", line 444, in arping
    filter="arp and arp[7] = 2", timeout=timeout, iface_hint=net, **kargs)
  File "/usr/lib/python2.7/site-packages/scapy/sendrecv.py", line 339, in srp
    a,b,c=sndrcv(s ,x,*args,**kargs)
  File "/usr/lib/python2.7/site-packages/scapy/sendrecv.py", line 124, in sndrcv
    inp, out, err = select(inmask,[],[], remaintime)
select.error: (4, 'Interrupted system call')

أتمني أن أجد حل لهذه المشكلة الغريبة فالكود هو نفسه في الحالتين ولكن في أحدهما يعمل وفي اﻷخري لا يعمل

لمن يريد التجربة عليه تثبيت حزمة python-scapy

#2

هذه علة من Scapy

http://trac.secdev.org/scapy/ticket/473

الرقعة المرفقة في العلة المذكورة حلت المشكلة

حزمة scapy عندي

scapy-2.0.0.10-6.fc17.noarch

والرقعة

--- scapy-2.0.1/scapy/sendrecv.py       2008-10-31 22:55:15.000000000 +0100
+++ scapy-2.0.1-modified/scapy/sendrecv.py      2010-11-02 14:21:32.032985928 +0100
@@ -12,6 +12,7 @@
 from utils import warning
 import plist
 from error import log_runtime,log_interactive
+import errno

 #################
 ## Debug class ##
@@ -121,7 +122,11 @@
                                 if len(inp) == 0 or pks in inp:
                                     r = pks.nonblock_recv()
                             else:
-                                inp, out, err = select(inmask,[],[], remaintime)
+                                inp = []
+                                try:
+                                    inp, out, err = select(inmask,[],[], remaintime)
+                                except Exception,e:
+                                    if e[0] != errno.EINTR: raise
                                 if len(inp) == 0:
                                     break
                                 if pks in inp:

والناتج

root /home/ahmed/Projects/tuxcut #  python tuxcut.py
WARNING: No route found for IPv6 destination :: (no default route?)
192.168.1.1/24
{'192.168.1.100': '08:00:27:be:55:18', '192.168.1.3': '00:1c:bf:c3:a7:62', '192.168.1.1': 'b0:48:7a:f5:cd:2a'}

Edit :

حتي اﻷصدار 2.2 من Scapy به نفس العلة

مواضيع مشابهة