6

我对 Python 比较陌生,并且在使用 Python 网络操作工具 Scapy 进行编程时遇到问题。但是,我不知道这是否是一个 Scapy 问题,因为它是一个 Python 新手问题。在scapy 网站上,他们提供了一个我无法在我自己的机器上运行的示例程序:

#! /usr/bin/env python

import sys
from scapy import sr1,IP,ICMP

p=sr1(IP(dst=sys.argv[1])/ICMP())
if p:
    p.show()

我得到:

Traceback (most recent call last):
  File "test.py", line 4, in <module>
    from scapy import sr1,IP,ICMP
ImportError: cannot import name sr1

所以我的问题是:在安装 Python 库时,我是否需要更改路径或类似的东西?另外,我可以在解释器中运行一些东西来告诉我 scapy 包的内容吗?我可以跑得from scapy import *很好,但是由于我不知道里面有什么,所以很难使用它。

4

4 回答 4

6

鉴于 Federico Ramponi 的警告“您应该单独使用 scapy 作为解释器,而不是作为库”,我想回答问题的非 scapy 特定部分。

问:安装 Python 库时,是否需要更改路径或类似的东西?

答:我认为您是在谈论PYTHONPATH整个系统范围内的变化。这通常不是必需的,也不是一个好主意。

第三方 Python 库应安装在系统目录中,例如/usr/lib/python2.5/site-packages,或安装在本地,在这种情况下,您可能需要PYTHONPATH在 Makefile 或驱动程序 shell 脚本中进行设置。

问:另外,我可以在解释器中运行一些东西来告诉我 scapy 包的内容吗?

答:你可以这样做:

>>> import scapy
>>> dir(scapy)

甚至更好:

>>> import scapy
>>> help(scapy)

在评论中提出了额外的问题。

问: 'import scapy' 和 'from scapy import *' 一样吗?

A: import scapy将本地命名空间中的 scapy 名称绑定到 scapy 模块对象。OTOH,from scapy import *不绑定模块名称,但是在 scapy 模块中定义的所有公共名称都绑定在本地命名空间中。

请参阅 Python 参考手册的第 6 和 7 段,6.12 The import statement

于 2008-10-23T13:59:23.523 回答
4

我有同样的问题,在 scapy v2.x 使用

 from scapy.all import * 

取而代之的是 v1.x

 from scapy import *

如此处所写

享受它 =)

于 2009-06-02T22:30:00.657 回答
3

它告诉你它在 scapy 中找不到 sr1。不确定你是多么的新手,但口译员永远是你的朋友。启动解释器(只需在命令行中输入“python”),然后在提示符 (>>>) 处输入(但不要输入 >,它们会自行显示):

>>> import scapy
>>> from pprint import pformat
>>> pformat(dir(scapy))

最后一行应该打印很多东西。您是否在任何地方看到“sr1”、“IP”和“ICMP”?如果不是,则示例有问题。

尝试也帮助(scapy)

这就是我可以在不安装 scapy 并亲自查看您的实际源文件的情况下为您提供多少帮助。

于 2008-10-23T14:05:46.273 回答
1

scapy包是一个用于网络操作和监控的工具。我很好奇你想用它做什么。监视你的朋友是不礼貌的。:-)

coventry@metta:~/src$ wget -q http://www.secdev.org/projects/scapy/files/scapy-latest.zip
coventry@metta:~/src$ unzip -qq scapy-latest.zip 
warning [scapy-latest.zip]:  61 extra bytes at beginning or within zipfile
  (attempting to process anyway)
coventry@metta:~/src$ find scapy-2.0.0.10 -name \*.py | xargs grep sr1
scapy-2.0.0.10/scapy/layers/dns.py:    r=sr1(IP(dst=nameserver)/UDP()/DNS(opcode=5,
scapy-2.0.0.10/scapy/layers/dns.py:    r=sr1(IP(dst=nameserver)/UDP()/DNS(opcode=5,
scapy-2.0.0.10/scapy/layers/inet6.py:from scapy.sendrecv import sr,sr1,srp1
scapy-2.0.0.10/scapy/layers/snmp.py:            r = sr1(IP(dst=dst)/UDP(sport=RandShort())/SNMP(community=community, PDU=SNMPnext(varbindlist=[SNMPvarbind(oid=oid)])),timeout=2, chainCC=1, verbose=0, retry=2)
scapy-2.0.0.10/scapy/layers/inet.py:from scapy.sendrecv import sr,sr1,srp1
scapy-2.0.0.10/scapy/layers/inet.py:            p = sr1(IP(dst=target, options="\x00"*40, proto=200)/"XXXXYYYYYYYYYYYY",timeout=timeout,verbose=0)
scapy-2.0.0.10/scapy/sendrecv.py:def sr1(x,filter=None,iface=None, nofilter=0, *args,**kargs):

根据最后一行,sr1是一个定义在scapy.sendrecv. 有人应该向作者提交文档错误。

于 2008-10-23T16:04:30.807 回答