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
相关产品推荐
相关产品推荐

