You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python开发Linux网络扫描器时optparse调用报错问题求助

问题修复方案

核心报错原因

你触发该报错的直接原因是没有实例化optparse.OptionParser类:你直接将类本身赋值给了my_object,没有加括号创建类实例,调用实例方法add_option时参数不匹配才触发了类型错误。
除此之外你的代码还存在缩进错误、参数名调用错误、返回值处理错误的问题,按以下步骤修改即可正常运行:

需修改的具体点位

  • get_user_input函数中,将my_object = optparse.OptionParser改为my_object = optparse.OptionParser(),完成类实例化;同时将(user_inputs,arguments)=my_object.parse_args()缩进调整到函数内部。
  • scan函数中,scapy.srp会返回[应答列表, 未应答列表]两个值,你需要提取应答列表的内容,整理成包含ip和mac的字典列表返回,不能直接调用summary()后无返回值。
  • 你定义的参数dest为ip_address,后续获取参数时要调用user_ip_address.ip_address,不是错误的ipaddress。
  • result_scan函数内部的打印语句、循环逻辑要补全缩进。

修正后完整代码

import scapy.all as scapy
import optparse

def get_user_input():
    my_object = optparse.OptionParser()
    my_object.add_option("-i","-ip", dest="ip_address",help="please type ip address")
    (user_inputs,arguments)=my_object.parse_args()
    return user_inputs

def scan(ip):
    arp_packet = scapy.ARP(pdst=ip)
    broadcast_packet = scapy.Ether(dst="ff:ff:ff:ff:ff:ff")
    arp_and_broadcast_packet = broadcast_packet/arp_packet
    answered_list = scapy.srp(arp_and_broadcast_packet,timeout=1, verbose=False)[0]
    client_list = []
    for element in answered_list:
        client_dict = {"ip": element[1].psrc, "mac": element[1].hwsrc}
        client_list.append(client_dict)
    return client_list

def result_scan(scan_list):
    print("IP\t\t\tMAC\n-----------------------------------------------------")
    for client in scan_list:
        print(client["ip"] + "\t\t" + client["mac"])

user_ip_address = get_user_input()
scan_result = scan(user_ip_address.ip_address)
result_scan(scan_result)

运行方式

执行命令时传入目标网段即可:
python3 Netscanner.py -i 192.168.1.0/24
注意需要用root权限运行,否则scapy无法发送ARP包

内容的提问来源于stack exchange,提问作者Mehmet Can Şahin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:48:04