由于工作中需要对多个IP段进行统计,并判断是否部署WEB服务,所以有了写这个脚本的想法。在中间测试脚本的时候,遇到了个坑,我在自己的电脑上运行脚本的时候,没有任何问题。但是当我放到我的服务器上去运行的时候,python在请求了几个站点之后就开始报错了。
ConnectionResetError: [Errno 104] Connection reset by peer
经过度娘,谷歌的一阵搜索,发现了问题,是由于我大量频繁的请求,导致服务器关闭了连接。由于技术有限,在这里我的解决办法就是在对URL进行请求的时候,添加个异常捕获(try except),成功解决了该问题!
以下是我昨天临时写的脚本源码,大致意思就是,获取文件中的IP列表,然后使用nmap对80,8080,443进行探测,并对开放这些端口的IP进行拼接并根据返回code判断是否有WEB服务。最后将结果写入到文件中。
import sys
import os
import nmap
import requests
import logging
import threading
from multiprocessing import Pool as ThreadPool
import time
from openpyxl import load_workbook,Workbook
th = 20
code = [200,403,404]
os.mknod('AAA.txt')
def GetIp(site):
url_list = []
print ('[* ]**************************GET-IP-SITE**************************[ *]\n')
ip_file = open(site,'r')
lines = ip_file.readlines()
print (lines)
for ip in lines:
ip = ip.rstrip('\r\n')
url_list.append(ip)
return url_list
def scan(url_list):
print ('[* ]' + url_list + ' **************************Join-Thread**************************[ *]\n')
ip_port = '80,8080,443'
active_list = []
nm = nmap.PortScanner()
ret = nm.scan(url_list,ip_port)
#print (str(ret['scan']))
if ret['scan']:
print ('[* ]' + url_list + ' **************************Runing**************************[ *]\n')
if ret['scan'][url_list]['tcp'][80]['state'] == 'open':
url = 'http://'+url_list
#print ('http://'+url_list)
active_list.append(url)
elif ret['scan'][url_list]['tcp'][8080]['state'] == 'open':
url1 = 'http://'+url_list+':8080'
#print ('http://'+url_list+':8080')
active_list.append(url1)
elif ret['scan'][url_list]['tcp'][443]['state'] == 'open':
url2 = 'https://'+url_list
#print ('https://'+url_list)
active_list.append(url2)
else:
print('[* ]'+'*******jump********')
return active_list
def active_ip(active_list):
if active_list:
print ('[* ]' + '************' +'up'+ str(active_list) +'WEB-up-or-die'+ '************[ *]\n')
logging.captureWarnings(True)
try:
response = requests.get(active_list[0],headers={'Host':'test.com'},verify=False,timeout=10)
if response.status_code in code:
print ('[* ]=========' + active_list[0] + ' =======up'+' code ' + str(response.status_code))
info = str(active_list[0]) + ' ' + str(response.status_code) + '\n'
return info
except requests.RequestException as e:
pass
def savefile(url_info):
print ('=================================>>>>>>>>'+str(url_info))
f = open('AAA.txt','r+')
for i in url_info:
if i:
f.write(str(i))
f.close()
if __name__ == '__main__':
site = sys.argv[1]
print ('[* ]******************************************GoGoGoGoing******************************************[ *]\n')
start = time.time()
pool = ThreadPool(th)
url_list = GetIp(site)
active_list1 = pool.map(scan,url_list)
print(str(active_list1))
url_info = pool.map(active_ip,active_list1)
savefile(url_info)
pool.close()
pool.join()
finish = time.time()
times = finish - start
print ('time:'+ str(times))
其实我本人基本上很少写python,也没有去系统的学习过,写的代码也是完全靠想象来写的,hh,所以我这个代码可能会有显得有点点糟糕。= =!。