为什么我一直收到TypeError?

时间:2016-08-03 14:44:06

标签: python init scapy

这是我遇到的错误,但只有当我尝试使用argparse

运行代码时

错误:

Traceback (most recent call last):
  File "portscanner.py", line 63, in <module>
    Main()
  File "http://portscanner.py", line 58, in Main
    AN(args.ip_addr)
  File "http://portscanner.py", line 34, in AN
    s = IP(dst=ip_addr)/TCP(sport=80, dport=80, flags="S") # creates packet ("S")
TypeError: __init__() got an unexpected keyword argument 'dst'

代码:

from logging import getLogger, ERROR
getLogger("scapy.runtime").setLevel(ERROR)
from scapy.all import *
import argparse
import sys
import socket
from IPy import IP

def create_packet(ip_addr):
    s = IP(dst=ip_addr)/TCP(sport=80, dport=80, flags="S") # creates packet ("S")
    print "pass"
def Main():
    parser = argparse.ArgumentParser(description='Script for port scanning')
    parser.add_argument("-H", "--host", help="host IP", dest="ip_addr", required=True, default="localhost")
    parser.add_argument("-s", "--syn", help="conduct a syn flag scan", action="store_true")
    parser.add_argument("-i", "--icmp", help="conduct a ICMP scan", action="store_true")
    parser.add_argument("-sp", "--start-port", help="starting/main port (s)", dest="dest_port", type=int, action="store")
    parser.add_argument("-ep", "--end-port", help="ending port port (s)", dest="eport", type=int, action="store")
    args = parser.parse_args()

    if args.syn:
        IP(args.ip_addr)
        create_packet(args.ip_addr)
    else:
        print 'fail'

if __name__ == '__main__':
    Main()

错误发生在34 scapy正在制作数据包的地方。现在当类似的代码(在不同的程序中制作数据包)时,我没有得到&#34; dst&#34;错误。

def scan(port):
    s = IP(dst=ip_addr)/TCP(sport=s_port, dport=port, flags="S") # creates packet ("S")
    snd = sr1(s, timeout=2) # sends packet
    if str(type(snd)) == "<type 'NoneType'>":
        pass
    elif snd.haslayer(TCP): # checks the layer of the response from server
        if snd.getlayer(TCP).flags == 0x12:
            r = IP(dst=ip_addr)/TCP(sport=s_port, dport=port, flags="R")
            rsnd = sr(r, timeout=2) # closes the connection
            print '[*] Port %d is open' % port
        elif snd.getlayer(TCP).flags == 0x14:
            pass # checks for rst packet

我搜索了Google,我看到了其他人遇到的类似错误,但我看不出为什么我的代码会这样做。特别是当它在不同的程序中工作时。

1 个答案:

答案 0 :(得分:0)

您正在将dst=关键字参数传递给IPy.IP()类:

from IPy import IP

# ...

IP(dst=ip_addr)

该类没有定义这样的关键字参数。查看project documentation我看不到定义了这样的关键字,只有位置 data参数defined in the __init__ method

def __init__(self, data, ipversion=0, make_net=0):

您可以删除dst=部分:

IP(ip_addr)

但也许您对scapy IP()类感到困惑。

我当然怀疑您可以将IPy.IP()类与scapy TCP()类混合,就像您在代码中尝试的那样。也许你想完全删除 from IPy import IP行。