这是一个非常基本的portscan / ping扫描脚本。当我在另一个脚本中单独使用它们时,这两个函数工作正常,但是当我在这个脚本中尝试它们时,我得到了属性错误
#!/usr/bin/python2.7
import argparse
import socket
import sys
def main():
parser = argparse.ArgumentParser(description="Do you wish to scan for live hosts or conduct a port scan?")
parser.add_argument("-s", dest='ip3octets', action='store', help='Enter the first three octets of the class C network to scan for live hosts')
parser.add_argument("-p", dest='ip', action='store',help='conduct a portscan of specified host')
args = parser.parse_args()
if args.ip != None:
portscan(args.ip)
if args.ip3octets != None:
pingsweep(args.ip3octets)
def portscan(args):
for port in range(20, 1025):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
portinfo = s.connect_ex((args.ip, port))
if (portinfo == 0):
print port, " is open"
s.close()
def pingsweep(args):
for ips in range(1, 255):
host = args.ip3octets+"."+str(ip)
data = "ping -c 1 " +host
process = subprocess.Popen(data, shell=True, stdout=subprocess.PIPE)
#give it time to respond
process.wait()
result_str = process.stdout.read()
if '64 bytes from' in result_str:
print host, ' is up'
if __name__ == "__main__":main()
如果我使用portscan(-p)函数,我会收到此错误:
Traceback (most recent call last):
File "./portscannertest.py", line 42, in <module>
if __name__ == "__main__":main()
File "./portscannertest.py", line 16, in main
portscan(args.ip)
File "./portscannertest.py", line 24, in portscan
portinfo = s.connect_ex((args.ip, port))
AttributeError: 'str' object has no attribute 'ip'
虽然使用pingsweep(-s)函数会产生此错误:
Traceback (most recent call last):
File "./portscannertest.py", line 42, in <module>
if __name__ == "__main__":main()
File "./portscannertest.py", line 19, in main
pingsweep(args.ip3octets)
File "./portscannertest.py", line 32, in pingsweep
host = args.ip3octets+"."+str(ip)
AttributeError: 'str' object has no attribute 'ip3octets'
关于我哪里出错的任何想法?非常感谢!
答案 0 :(得分:1)
当您致电portscan
时,请使用args.ip
而不是args
来呼叫。
你可以通过这样做来解决它:
if args.ip != None:
portscan(args)
或者,如果你只想传递ip
,你需要记住你给的是函数IP,而不是参数对象。
pingsweep
也是如此。
答案 1 :(得分:1)
您正在将args.ip
传递给portscan,然后portscan使用ip
的{{1}}属性。显然,args.ip.ip
与args.ip
不同(可以对某些对象的某些属性为真,但通常不是这样,并且当然在这里不合逻辑)。将整个args
传递给函数或(首选)使函数接受参数args
并使用它(而不是ip
)。类似于ip.ip
。
答案 2 :(得分:0)
您使用以下代码将参数传递给portscan
和pingsweep
:
if args.ip != None:
portscan(args.ip)
if args.ip3octets != None:
pingsweep(args.ip3octets)
在这些函数中,您应该直接引用args
来使用它们。使用args.ip
和args.ip3octets
不正确。