Scapy 安装在 osx 上失败,并出现 dnet 导入错误

Posted

技术标签:

【中文标题】Scapy 安装在 osx 上失败,并出现 dnet 导入错误【英文标题】:Scapy installation fails on osx with dnet import error 【发布时间】:2014-12-01 11:16:39 【问题描述】:

安装 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   

【问题讨论】:

你是如何安装scapypcapy的?你用过哪些命令?是否报告了任何错误?你安装libdnet了吗? 添加到原始帖子中。全部成功退出,脚本在刷新的终端中重新运行,但出现相同的错误 你有什么OS OSX Mavericks System Version: OS X 10.9.5 (13F34) Kernel Version: Darwin 13.4.0 Boot Volume: Macintosh HD Boot Mode: Normal 【参考方案1】:

编辑 (30.10.19)

安装 Scapy

Scapy 的官方文档lists 可能的捆绑包:

默认,仅 Scapy$ pip install scapy 推荐,ScapyiPython$ pip install --pre scapy[basic] 完成,Scapy 及其所有主要依赖项: $ pip install --pre scapy[complete]

安装可选依赖项

Scapy 需要某些特殊功能的某些依赖项,例如绘图、2D 和 3D 图形、WEP 解密、PKI 操作和 TLS 解密、fingerprinting 和 @987654327 @。大多数这些软件都可以通过pip 安装。 Scapy 的官方文档presents 他们以及一些测试安装是否成功的示例。

配置 libpcap 集成

Scapy 的官方文档 states 说它从最近的版本开始就可以本地运行,但可以将其配置为使用 libpcap,可以使用 Homebrew 或 @987654333 安装@。两种安装方法都可以正常工作,但 Homebrew 用于使用Travis CI 运行单元测试。请注意,可能已经安装了 Libpcap,例如,如果安装了 tcpdump,例如 OSX

使用 Homebrew 安装

$ brew update  # update Homebrew
$ brew install libpcap  # install libpcap

通过from scapy.config import conf; conf.use_pcap = TrueScapy中启用它。

使用 MacPorts 安装

$ sudo port -d selfupdate  # update MacPorts
$ sudo port install libpcap  # install libpcap

通过from scapy.config import conf; conf.use_pcap = TrueScapy中启用它。


编辑 (27.05.15)

This answer 声明所有提到的问题都已修复,并提供了更简单的安装方法。然而,它的 cmets 表明,虽然它似乎可以在 OS X 10.10 YosemiteOS X 10.11 El Capitan 上运行,但对于某些其他版本可能会失败。

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

如果 Homebrewsite-packages 不在 Pythonsys.path 变量中,则应执行以下操作(有关详细信息,请参阅 this),用实际的 username 替换占位符 :

$ mkdir -p /Users/<USERNAME>/Library/Python/2.7/lib/python/site-packages
$ echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' >> /Users/<USERNAME>/Library/Python/2.7/lib/python/site-packages/homebrew.pth

原来的答案

您尚未完成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 分支)执行类似的更改,如this answer 中所述。

【讨论】:

是的,我也运行过,再次正常退出,但在导入 dnet 时出现同样的错误 这似乎是出错的部分。 from pcapdnet import * File "/Library/Python/2.7/site-packages/scapy/arch/pcapdnet.py", line 160, in &lt;module&gt; import dnet ImportError: No module named dnet 出现配置错误,我已将输出添加到原始帖子中。 对不起,我不清楚。这是 2 个单独的命令,我认为 prefix 标志不是必需的,所以我删除了它。请查看我更新的帖子。 这似乎已经修复了它,脚本本身在我面前爆炸了,但导入错误现在消失了。编辑unix.py 并使用这些标志进行编译似乎已经解决了它。谢谢!【参考方案2】:

上面提到的所有问题似乎都已解决。我正在运行 OS X Yosemite。只需以下三个命令,我就得到了一个工作 scapy。

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

【讨论】:

但缺少 dnet "ImportError: No module named dnet" 这里也一样。你是如何摆脱丢失的 dnet 错误的? 仍然是 dnet 错误。这个答案应该被否决。【参考方案3】:

我正在运行 OSX 10.5.9 - 一直在努力让 scapy 正常工作 - 在安装 dnet/pcap 库后,我也得到了“OSError:设备未配置”。尝试用

替换 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

像魅力一样工作!

【讨论】:

【参考方案4】:

(这是对Tim Wu's Answer 的评论,但我错过了这样做的声誉)

请记住按照 brew 实际告诉您的操作:

==> 警告 Python 模块已安装,而 Homebrew 的站点包不在您的 Python sys.path 中,因此您将无法导入此公式安装的模块。 如果您打算使用这些模块进行开发,请运行:[...]

mkdir -p /Users/YourUsernameHere/Library/Python/2.7/lib/python/site-packages
echo 'import site; site.addsitedir("/usr/local/lib/python2.7/site-packages")' >> /Users/YourUsernameHere/Library/Python/2.7/lib/python/site-packages/homebrew.pth

所以只需重新运行 brew 命令并执行它告诉您的两行代码即可使用所有已安装的 brew python 包。

【讨论】:

注意:如果您复制粘贴上述脚本,请记住编辑“YourUsernameHere”!【参考方案5】:

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

【讨论】:

以上是关于Scapy 安装在 osx 上失败,并出现 dnet 导入错误的主要内容,如果未能解决你的问题,请参考以下文章

Scapy 模块无法在 RPI 上运行并出现错误:“没有这样的文件或目录:b'liblibc.a'”

RVM:在 Mac OSX El Capitan 上安装最新版本的 ruby​​ 失败

从 PHP 5.2.8 源代码在 Mac OSX (10.5) 上安装 mcrypt 测试失败,我该怎么办?

在 OSX Mavericks 上安装 Cutecom 失败

pod 安装失败并出现错误:错误:1006706B:椭圆曲线例程

Applescript 在 Mavericks 上通过 ssh 启动时失败并出现错误 (-600)