更新:

1.使用optparse来获取命令行参数

#-*-coding=utf-8-*-#__author__='sanr'#__email__='5754190@qq.com'#__url__='http://0x007.blog.51cto.com/'#__version__='0.3'importrequestsimportrefromthreadingimportThread,Lockimportsysimportchardetimportnetaddrimportstructimportsocketimportosimportoptparselock=Lock()defip2int(addr):returnstruct.unpack("!I",socket.inet_aton(addr))[0]defint2ip(addr):returnsocket.inet_ntoa(struct.pack("!I",addr))defint_dec(pagehtml):charset=Noneifpagehtml!='':#print'usecharsetdect'enc=chardet.detect(pagehtml)#print'enc=',encifenc['encoding']andenc['confidence']>0.9:charset=enc['encoding']ifcharset==None:charset_re=re.compile("((^|;)\s*charset\s*=)([^\"']*)",re.M)charset=charset_re.search(pagehtml[:1000])charset=charsetandcharset.group(3)orNone#testcharsettry:ifcharset:unicode('test',charset,errors='replace')exceptException,e:print'Exception',echarset=None#print'charset=',charsetreturncharsetdefhttp_banner(url):ip=urltry:url=requests.get(url,timeout=2)body=url.contentcharset=Noneifbody!='':charset=int_dec(body)ifcharset==Noneorcharset=='ascii':charset='ISO-8859-1'ifcharsetandcharset!='ascii'andcharset!='unicode':try:body=unicode(body,charset,errors='replace')exceptException,e:body=''Struts=url.status_codeServer=url.headers['server'][0:13]ifStruts==200orStruts==403orStruts==401:title=re.findall(r"<title>(.*)<\/title>",body)iflen(title):title=title[0].strip()else:title=''#输出加锁防止第二行输入#申请锁lock.acquire()print('%s\t%d\t%-10s\t%s'%(ip.lstrip('http://'),Struts,Server,title))#释放锁lock.release()except(requests.HTTPError,requests.RequestException,AttributeError,KeyError),e:passif__name__=='__main__':parser=optparse.OptionParser('usage:%prog[options]target')parser.add_option('-p','--port',dest='port',default='80',type='string',help='Port.default=80')(options,args)=parser.parse_args()#parser.parse_args处理之后给option返回一个字典对象,对象的key就是你上面设置的dest的值iflen(args)<1:parser.print_help()print'usage:python%s218.92.227.1/24'%os.path.basename(sys.argv[0])print'usage:python%s218.92.227.1-218.92.227.254'%os.path.basename(sys.argv[0])print'usage:python%s218.92.227.1./24-p8080'%os.path.basename(sys.argv[0])print'usage:python%s218.92.227.1-218.92.227.254-p8080'%os.path.basename(sys.argv[0])sys.exit(0)ips=args[0]port=options.portif'-'inips:start,end=ips.split('-')startlong=ip2int(start)endlong=ip2int(end)ips=netaddr.IPRange(start,end)foripinlist(ips):url='http://%s:%s'%(ip,port)t=Thread(target=http_banner,args=(url,))t.daemon=Falset.start()elif'/'inips:ips=netaddr.IPNetwork(ips)foripinlist(ips):url='http://%s:%s'%(ip,port)t=Thread(target=http_banner,args=(url,))t.daemon=Falset.start()