Python Scapy Arp扫描子网脚本来自一本书

Python Scapy Arp扫描子网脚本来自一本书,python,scapy,Python,Scapy,我正在读一本Python书,书中有一个脚本,可以使用scapy(Python工具/模块)扫描子网中任何启动的主机,并报告它们的IP和MAC地址。此脚本是对先前调用/usr/bin/arping的脚本的增强。以前的脚本一次只允许一个IP地址,并且平台依赖于可用的arping工具。显然,这个脚本(对我来说不适用)是独立于平台的 如果有人可以查看脚本并调试它,那将是非常棒的。以下是脚本: #! /usr/bin/env python from scapy.all import srp from sc

我正在读一本Python书,书中有一个脚本,可以使用scapy(Python工具/模块)扫描子网中任何启动的主机,并报告它们的IP和MAC地址。此脚本是对先前调用
/usr/bin/arping
的脚本的增强。以前的脚本一次只允许一个IP地址,并且平台依赖于可用的
arping
工具。显然,这个脚本(对我来说不适用)是独立于平台的

如果有人可以查看脚本并调试它,那将是非常棒的。以下是脚本:

#! /usr/bin/env python

from scapy.all import srp
from scapy.all import Ether, ARP, conf

import sys

def arping(iprange="10.0.1.0/24"):
    """Arping function takes IP Address or Network, returns nested mac/ip list"""

    #conf, verb = 0
    ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=iprange), timeout=2)

    collection = []
    for snd, rcv in ans:
        result = rcv.sprintf(r"%ARP.psrc% %Ether.src%").split()
        collection.append(result)
    return collection

if __name__ == "__main__":
    if len(sys.argv) > 1:
        for ip in sys.argv[1:]:
            print "arping", ip
            print arping(ip)

    else:
        print arping()
脚本不起作用。它只是打印出它正在扫描东西,但什么也没找到

我在这个网站上找到了一个同样不起作用的教程。该网站的相关内容如下:

请参阅下面的示例,了解我在运行此脚本时获得的输出:

loser@loser:~/Desktop/pyFun2$ gedit arp_scanz.py
loser@loser:~/Desktop/pyFun2$ sudo python arp_scanz.py
WARNING: No route found for IPv6 destination :: (no default route?)
Begin emission:
Finished to send 256 packets.

Received 0 packets, got 0 answers, remaining 256 packets
[]
有人知道我错过了什么吗

更新-解决方案 更改srp函数或方法调用以指定要扫描的确切接口,如下所示:

ans, unans = srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=iprange),iface="en1", timeout=2)

可能有很多东西。使用有效的IP起始点,我的网络上的脚本似乎运行得很好

你的IP范围合适吗

例如,我使用:

def arping(iprange="192.168.1.*"):
这将产生正确的结果,并且与scapy的内置arping()函数的结果相同


因此,我认为可能不是代码本身,而是您正在尝试的范围。

感谢您在您的机器上测试此功能并提供一些有用的建议。我发现我必须指定要扫描的接口是我的问题。我还发现,在交互式shell中使用
arping()
方法在使用
sudo
命令打开python交互式shell后,确实会返回相同的结果。我不确定昨晚为什么不起作用。也许我需要重新启动我的机器,或者我太累了,错过了一些小细节。请参见上文,了解我现在对
srp
的调用,并指定要扫描的接口:DIt不是我正在使用的范围,但我没有意识到这个,scapy脚本,实际上对任何其他人都有效。感谢您了解这一点,并报告您的结果。这激发了我的灵感……我发现我还可以使用我认为是CIDR的符号指定I范围,比如so
192.168.1.0/24
这将扫描子网中的所有内容,就像
192.168.1.*
:D一样