在使用dnet导入错误的osx上,Scapy安装失败

时间:2014-10-07 05:24:01

标签: python macos installation importerror scapy

安装Scapy时遇到问题,并且需要依赖。我花了一些时间谷歌搜索解决方案,但所有的解决方案'似乎影响旧版本的Python,或者根本不起作用。

脚本:

#!/usr/bin/python

import threading
import Queue
import time
from scapy.all import *

class WorkerThread(threading.Thread) :

    def __init__(self, queue, tid) :
        threading.Thread.__init__(self)
        self.queue = queue
        self.tid = tid
        print 'Worker: %d' %self.tid

    def run(self) :
        total_ports = 0
        while True :
            port = 0
            try :
                port = self.queue.get(timeout=1)
            except Queue.Empty :
                print 'Worker %d exiting. %d ports scanned'  %(self.tid, total_ports)

                return

                #Scanning begins

            ip = sys.argv[1]
            response = sr1(IP(dst=ip)/TCP(dport=port, flags='S'), verbose=False, timeout=.2)


            if response :
                if response[TCP].flags == 18 :

                    print 'ThreadID: %d: Got port no. %d status: OPEN' %(self.tid, port)
                self.queue.task_done()
                total_ports += 1

queue = Queue.Queue()

threads = []
for i in range(1, 10) :
    print 'Creating WorkerThread : %d' %i
    worker = WorkerThread(queue, i)
    worker.setDaemon(True)
    worker.start()
    threads.append(worker)
    print 'WorkerThread %d created' %i

for j in range(1, 100) :
    queue.put(j)

queue.join()

for item in threads :
    item.join()

print 'Scanning complete'

Python版本是2.7.5并验证了Python的路径。

which python
/usr/bin/python

执行脚本时,我收到以下错误:

./multi-threaded-scanner.py
Traceback (most recent call last):
  File "./multi-threaded-scanner.py", line 6, in <module>
    from scapy.all import *
  File "/Library/Python/2.7/site-packages/scapy/all.py", line 16, in <module>
    from arch import *
  File "/Library/Python/2.7/site-packages/scapy/arch/__init__.py", line 75, in <module>
    from bsd import *
  File "/Library/Python/2.7/site-packages/scapy/arch/bsd.py", line 12, in <module>
    from unix import *
  File "/Library/Python/2.7/site-packages/scapy/arch/unix.py", line 20, in <module>
    from pcapdnet import *
  File "/Library/Python/2.7/site-packages/scapy/arch/pcapdnet.py", line 160, in <module>
    import dnet
ImportError: No module named dnet

我可以同时使用Scapy和Python交互式解释器,并且在Python解释器中运行import scapy不会产生任何错误。 最初运行脚本时,pcapy模块丢失,但我安装了该模块 然后问题切换到dnet,我无法找到解决方案。 A similar post似乎描述了同样的问题,但解决方法没有效果。 任何人都可以对这个问题有所了解吗?

用于安装pcapy和libdnet的命令:

libdnet-1.11.tar.gz(01-19-2005)

` ~/Downloads/libdnet-1.11    
chmod a+x configure
 ~/Downloads/libdnet-1.11    
./configure  && make`

成功退出

Pcapy:最新稳定版(0.10。8),2010年8月26日更新

~/Downloads/pcapy-0.10.8 
sudo python setup.py install Password: running install running build running build_ext running build_scripts running install_lib running install_scripts changing mode of /usr/local/bin/96pings.pcap to 777 changing mode of /usr/local/bin/pcapytests.py to 777 running install_data running install_egg_info Removing /Library/Python/2.7/site-packages/pcapy-0.10.8-py2.7.egg-info Writing /Library/Python/2.7/site-packages/pcapy-0.10.8-py2.7.egg-info ~/Downloads/pcapy-0.10.8 

使用新标志进行编译的结果

 ~/Downloads/libdnet-1.12    
sudo CFLAGS='-arch i386 -arch x86_64' ./configure --prefix=/usr and archargs='-arch i386 -arch x86_64' make
configure: WARNING: you should use --build, --host, --target
configure: WARNING: you should use --build, --host, --target
checking for a BSD-compatible install... /usr/bin/install -c
checking whether build environment is sane... yes
/Users/richardcurteis/Downloads/libdnet-1.12/config/missing: Unknown `--is-lightweight' option
Try `/Users/richardcurteis/Downloads/libdnet-1.12/config/missing --help' for more information
configure: WARNING: 'missing' script is too old or missing
checking for a thread-safe mkdir -p... config/install-sh -c -d
checking for gawk... no
checking for mawk... no
checking for nawk... no
checking for awk... awk
checking whether make sets $(MAKE)... yes
checking whether make supports nested variables... yes
checking whether to enable maintainer-specific portions of Makefiles... no
checking build system type... Invalid configuration `and': machine `and' not recognized
configure: error: /bin/sh config/config.sub and failed
 ~/Downloads/libdnet-1.12   

5 个答案:

答案 0 :(得分:16)

上面提到的所有问题似乎都是固定的。我正在运行OS X Yosemite。我通过以下三个命令得到了一个工作scapy。

brew install --with-python libdnet
pip install pcapy
pip install scapy

答案 1 :(得分:15)

编辑 - This answer below说明所有提到的问题都已修复,并提供了一种更简单的安装方法。但是,它的评论表明虽然它似乎适用于 OS X 10.10 Yosemite OS X 10.11 El Capitan ,但对于某些其他版本可能会失败。


您尚未完成libdnet及其Python包装器的安装,如Scapy's installation guide中所述:

$ wget https://github.com/dugsong/libdnet/archive/libdnet-1.12.tar.gz
$ tar xfz libdnet-1.12.tgz
$ ./configure
$ make
$ sudo make install
$ cd python
$ python2.5 setup.py install

如果您的系统是64位,请改用这些编译命令:

$ CFLAGS='-arch i386 -arch x86_64' ./configure
$ archargs='-arch i386 -arch x86_64' make

此外,请确认您已安装正确的版本,即1.12而不是1.11。

如果失败,请尝试通过macports安装并使用其dnet.so文件,如here所述:

$ port selfupdate
$ port upgrade outdated
$ port install py27-libdnet
$ port install libdnet 
$ cp /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/dnet.so /Library/Python/2.7/site-packages

该链接还建议更改/Library/Python/2.7/site-packages/scapy/arch/unix.py中的一些代码(修复OSError: Device not configured)。

更改第34行:

f=os.popen("netstat -rn") # -f inet

为:

f=os.popen("netstat -rn | grep -v vboxnet") # -f inet

如下:

def read_routes():
    if scapy.arch.SOLARIS:
#       f=os.popen("netstat -rvn") # -f inet
        f=os.popen("netstat -rn | grep -v vboxnet") # -f inet

如果仍然收到错误OSError: Device not configured,请尝试对if子句的其他分支(特别是其else分支)执行类似的更改,如{{{{1}}中所述。 3}}

答案 2 :(得分:2)

我正在运行OSX 10.5.9 - 花了很多时间试图让scapy工作 - 安装dnet / pcap库后我得到了“OSError:Device not configured”。尝试用unix.py替换第34行

"netstat -rn | grep -v vboxnet"

仍有同样的错误。但是当我在if块的“else”部分改变第37行时:

def read_routes():
    if scapy.arch.SOLARIS:
        f=os.popen("netstat -rvn") # -f inet
    elif scapy.arch.FREEBSD:
        f=os.popen("netstat -rnW") # -W to handle long interface names
    else:
        # f=os.popen("netstat -rn") # -f inet
        f=os.popen("netstat -rn | grep -v vboxnet") # -f inet

像魅力一样!

答案 3 :(得分:2)

(这是对Tim Wu答案的评论,但我很遗憾这样做的声誉)

请记住brew正在告诉你的事情:

  

==&GT;注意事项
  已安装Python模块,Homebrew的site-packages不在Python sys.path中,因此您将无法导入此公式安装的模块。
  如果您打算使用这些模块进行开发,请运行:[...]

{{1}}

所以只需重新运行brew命令并执行两行,告诉你使用所有已安装的brew python包。

答案 4 :(得分:0)

在OSX El Capitan中,对我有用的是强制pip使用sudo重新安装pcapy: sudo pip install --user pcapy -I