在 Yosemite 上安装 Scapy

Installing Scapy on Yosemite

我正在尝试 运行 Scapy 在我的 Macbook pro 上使用 OS Yosemite。

我是用下面的命令安装的

brew install scapy

一切看起来都很好,但是当我 运行

scapy

我收到这个错误

Traceback (most recent call last):
File "/usr/local/bin/scapy", line 25, in <module>
interact()
File "/Library/Python/2.7/site-packages/scapy/main.py", line 278, in
interact
scapy_builtins = __import__("all",globals(),locals(),".").__dict__
File "/Library/Python/2.7/site-packages/scapy/all.py", line 25, in   <module>
from route import *
File "/Library/Python/2.7/site-packages/scapy/route.py", line 162, in <module>
conf.route=Route()
File "/Library/Python/2.7/site-packages/scapy/route.py", line 22, in __init__
self.resync()
File "/Library/Python/2.7/site-packages/scapy/route.py", line 31, in resync
self.routes = read_routes()
File "/Library/Python/2.7/site-packages/scapy/arch/unix.py", line 86, in read_routes
ifaddr = scapy.arch.get_if_addr(netif)
File "/Library/Python/2.7/site-packages/scapy/arch/__init__.py", line 36, in get_if_addr
return socket.inet_ntoa(get_if_raw_addr(iff))
File "/Library/Python/2.7/site-packages/scapy/arch/pcapdnet.py", line 201, in get_if_raw_addr
return i.get(ifname)["addr"].data
File "dnet.pyx", line 990, in dnet.intf.get
OSError: Device not configured`

我该如何解决?

编辑:如果我 运行

sudo scapy 

我明白了:

Traceback (most recent call last):
File "/usr/local/bin/scapy", line 25, in <module>
interact()
File "/Library/Python/2.7/site-packages/scapy/main.py", line 278, in interact
scapy_builtins = __import__("all",globals(),locals(),".").__dict__
File "/Library/Python/2.7/site-packages/scapy/all.py", line 25, in <module>
from route import *
File "/Library/Python/2.7/site-packages/scapy/route.py", line 162, in <module>
conf.route=Route()
File "/Library/Python/2.7/site-packages/scapy/route.py", line 22, in __init__
self.resync()
File "/Library/Python/2.7/site-packages/scapy/route.py", line 31, in resync
self.routes = read_routes()
File "/Library/Python/2.7/site-packages/scapy/arch/unix.py", line 86, in read_routes
ifaddr = scapy.arch.get_if_addr(netif)
File "/Library/Python/2.7/site-packages/scapy/arch/__init__.py", line 36, in get_if_addr
return socket.inet_ntoa(get_if_raw_addr(iff))
File "/Library/Python/2.7/site-packages/scapy/arch/pcapdnet.py", line 201, in get_if_raw_addr
return i.get(ifname)["addr"].data
KeyError: 'addr'

我遇到了与 'addr' 键错误完全相同的问题并解决了(您的第一个错误将是权限 - 所以是的,您需要 sudo)。

通过编辑底层 Python 代码来获取一些调试信息,我可以看到正在检查的接口上没有设置 IP 地址,但是 OS 有一个 (old/manual ) 使用此未配置接口的静态路由。

当 dnet 是 loading/importing 时,它会遍历路由,然后检查接口以获取 IP(它不能这样做,因为我不再使用它,因此它没有 IP)。

删除了静态路由,它工作正常。

你的问题是known bug。在他们解决问题之前,您可以试试这个:

在文件 scapy/arch/unix.py 中添加 elif scapy.arch.DARWIN: 部分:

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
    elif scapy.arch.DARWIN:
        f = os.popen("netstat -rn | grep -v vboxnet")  # Fix OSX problem            
    else:
        f=os.popen("netstat -rn") # -f inet
    ok = 0
    mtu_present = False

如果您找不到 scapy 位置,您可以 运行

python -v
>>> import scapy
import scapy # directory /Library/Python/2.7/site-packages/scapy

Reference