python 实现IP开放端口探测与是否部署WEB服务探测

由于工作中需要对多个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,所以我这个代码可能会有显得有点点糟糕。= =!。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值