现在大多服务器都有做icmp限制或直接禁掉,导致我们业务去连接服务器异常时无法判断是程序问题还是网络问题,所以写一个简单探测tcp端口脚本来探测服务器所开放的端口,再使用tcp测试双向时延来排掉网络问题

  1 #!/usr/bin env python
2 #-*-coding:utf-8-*-
3 import socket,time,threading
4 import signal,os,argparse,re
5 #---------------------------------------------信号侦听模块------------------------------------------
6 def signal_handler(signal, frame):
7 # print(success)
8 if success:
9 for ip in success:
10 print()
11 print('扫描结束,主机%s,开放的端口有%s'%(ip,success[ip]))
12 os._exit(0)
13 signal.signal(signal.SIGINT, signal_handler)
14 #----------------------------------------------扫描函数-------------------------------------------------
15 socket.setdefaulttimeout(0.1)
16 success = {}
17 port_li = []
18 def scan(HOST,port,q):
19 startport,endport = port
20 for port in range (startport,endport):
21 s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
22 try:
23 s.connect((HOST,port))
24 print('%s-%d端口开启'%(HOST,port))
25 port_li.append(port)
26 success[HOST]=port_li
27 except:
28 pass
29 def thread(ip,q,startport,maxport):
30 li = []
31 startport = 1
32 endport = startport+200
33 if endport > maxport:
34 endport = maxport
35 dup=[(startport,endport)]
36 while endport < maxport:
37 startport,endport=endport,endport+200
38 if endport >= maxport:
39 endport = maxport
40 dup.append((startport,endport))
41 for port in dup:
42 t1 = threading.Thread(target=scan,args=(ip,port,q))
43 t1.start()
44 li.append(t1)
45 for t in li:
46 t.join()
47 if success:
48 q.put(success)
49
50
51 if __name__=='__main__':
52 from multiprocessing import Process,Queue
53 #接收参数
54 parser = argparse.ArgumentParser(description='ip_scan')
55 parser.add_argument('-t',action = 'store',dest='tip')
56 parser.add_argument('-p',action='store',dest='port')
57 args= parser.parse_args()
58 try:
59 ip = args.tip
60 port = args.port
61 dip = re.findall('\d+',ip)
62 startport,maxport = port.split('-')
63 except:
64 print('-----------------example--------------')
65 print('tcpportstatus.py -t 10.0.0.0/24 -p 0-65535')
66 exit(0)
67 q = Queue()
68 li = []
69 ip_list = []
70 if int(dip[4]) ==0 or int(dip[4])>32:
71 print('----------------掩码错误----------------------')
72 exit(0)
73 #计算地址数量
74 subnet = int(dip[4])%8
75 if subnet !=0:
76 subnet_count = 2**(8-subnet)
77 else:
78 subnet_count = 2**subnet
79 #创建ip地址列表
80 if 32 >= int(dip[4])>24:
81 #验证子网划分是否错误
82 if int(dip[3])%subnet_count != 0:
83 print('-----------ip格式错误-----------')
84 exit(0)
85 startip = int(dip[3])
86 endip = startip + subnet_count
87 dip[3] = '%s'
88 dip = '.'.join(dip[0:4])
89 for d in range(startip,endip):
90 ip_list.append(dip%d)
91 elif int(dip[4])>16:
92 if int(dip[2])%subnet_count != 0:
93 print('-----------ip格式错误-----------')
94 exit(0)
95 startip = int(dip[2])
96 endip = startip + subnet_count
97 dip[2] = '%s'
98 dip[3] = '%s'
99 dip = '.'.join(dip[0:4])
100 for c in range(startip,endip):
101 dip_c = dip%(c,'%s')
102 for d in range(1,256):
103 dip_d = dip_c%d
104 ip_list.append(dip_d)
105 elif int(dip[4])>8:
106 if int(dip[1])%subnet_count != 0:
107 print('-----------ip格式错误-----------')
108 exit(0)
109 startip = int(dip[1])
110 endip = startip + subnet_count
111 dip[1] = '%s'
112 dip[2] = '%s'
113 dip[3] = '%s'
114 dip = '.'.join(dip[0:4])
115 for b in range(startip,endip):
116 dip_b = dip%(b,'%s','%s')
117 for c in range(0,256):
118 dip_c = dip_b%(c,'%s')
119 for d in range(1,256):
120 dip_d = dip_c%d
121 ip_list.append(dip_d)
122 elif int(dip[4])>0:
123 if int(dip[1])%subnet_count != 0:
124 print('-----------ip格式错误-----------')
125 exit(0)
126 startip = int(dip[0])
127 endip = startip + subnet_count
128 dip[0] = '%s'
129 dip[1] = '%s'
130 dip[2] = '%s'
131 dip[3] = '%s'
132 dip = '.'.join(dip[0:4])
133 for a in range(startip,endip):
134 dip_a = dip%(a,'%s','%s','%s')
135 for b in range(0,256):
136 dip_b = dip_a%(b,'%s','%s')
137 for c in range(0,256):
138 dip_c = dip_b%(c,'%s')
139 for d in range(0,256):
140 dip_d = dip_c%d
141 ip_list.append(dip_d)
142 print('-----------------------------------开始扫描------------------------------------')
143 starttime = time.time()
144 print('扫描地址数量%s,端口%s-%s'%(len(ip_list),int(startport),int(maxport)))
145
146 for address in ip_list:
147 t1 = Process(target=thread,args=(address,q,int(startport),int(maxport)))
148 t1.start()
149 li.append(t1)
150 for t in li:
151 t.join()
152 usetime = time.time()-starttime
153 print('--------------------------扫描结束用时%s秒----------------------'%int(usetime))
154 if not q.empty():
155 while not q.empty():
156 q_dic = q.get()
157 for ip in q_dic:
158 print('扫描结束,此次扫描的主机%s,开放的端口有%s'%(ip,q_dic[ip]))
159 else:
160 print()
161 print('扫描结束,此次扫描的主机,没有开放的TCP端口')

多进程多线程扫描,一个ip一个进程,根据扫描机器cpu性能可以调整startport和endport的参数来跑更多线程,以我的设备为例,Intel(R) Xeon(R) CPU E3-1220 V2 @ 3.10GHz ,扫描50个ip地址65535以下端口用时71秒

探测到端口后剩下的测试使用tcping.py(见zabbix系列)就行了

python 批量探测服务端开放的TCP端口的更多相关文章

  1. python的flex服务端数据接口开发

    python的flex服务端数据接口开发 python 如果给flex提供服务端,需要提供一个网关和一个可供客户端(flex)调用的类.这方面我更加推荐用twisted来写这个网关,因为twisted ...

  2. thrift例子:python客户端/java服务端

    java服务端的代码请看上文. 1.说明: 这两篇文章其实解决的问题是,当使用python去访问大数据线上集群的时候,遇到两个问题: 1)python-hadoop和python-hive相关包链接不 ...

  3. python创建udp服务端和客户端

    1.udp服务端server from socket import * from time import ctime HOST = '' PORT = 8888 BUFSIZ = 1024 ADDR ...

  4. python的select服务端的代码和客户端的代码

    服务端的代码 import socket import queue import select ip_bind = ("127.0.0.1",9000) message_queue ...

  5. python连接mysql服务端

    python连接mysql的客户端 import pymysql # 导入模块 conn = pymysql.connect( host='127.0.0.1', # 主机模块 port=3306, ...

  6. [Python 网络编程] TCP编程/群聊服务端 (二)

    群聊服务端 需求分析: 1. 群聊服务端需支持启动和停止(清理资源); 2. 可以接收客户端的连接; 接收客户端发来的数据 3. 可以将每条信息分发到所有客户端 1) 先搭架子: #TCP Serve ...

  7. Python中的Tcp协议的应用之Tcp服务端程序开发

    TCP通信协议是面向连接的可靠的网络通信协议. 网络间想要进行数据传输必须要用到socket,socket翻译过来叫做套接字,其主要作用是不同设备或同一台设备之间的进程通信工具. Python中的Tc ...

  8. python网络编程TCP服务多客户端的服务端开发

    #服务多客户端TCP服务端开发 2 #方法说明 3 """ 4 bind(host,port)表示绑定端口号,host是ip地址,ip地址一般不进 行绑定,表示本机的任何 ...

  9. 服务端挂了,客户端的 TCP 连接还在吗?

    作者:小林coding 计算机八股文网站:https://xiaolincoding.com 大家好,我是小林. 如果「服务端挂掉」指的是「服务端进程崩溃」,服务端的进程在发生崩溃的时候,内核会发送 ...

随机推荐

  1. Streamlit:快速数据可视化界面工具

    目录 Streamlit简介 Streamlit使用指南 常用命令 显示文本 显示数据 显示图表 显示媒体 交互组件 侧边栏 缓存机制 Streamlit使用Hack Streamlit的替代品 相关 ...

  2. mian中的argv调用时为什么不是*argv

    c++main函数char * argv[]是个指针数组,元素是指针,为何argv[1]得到不是地址? 照我的理解char *argv[]保存的应该是一组指针,即地址,每个地址中保存的是char类型变 ...

  3. html5中常被忘记的标签,属性

    placeholder placeholder是input中的属性,就是默认输入的text,当用户输入时,text会被清空. 用法 <input type ="text" p ...

  4. 前端每日实战:134# 视频演示如何用 CSS 和 GSAP 创作一个树枝发芽的 loader

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/LJmpXZ 可交互视频 此视频是可 ...

  5. 软件构造实验-百度图像识别api

    识别结果: 识别结果:

  6. 一个好用的swagger第三方ui-xiaoymin

    swagger自带的ui界面实在是看的难受 配置完默认访问地址:ip:port/swagger-ui.html 推荐一个好用的第三方ui,界面如图: 使用方法: 1.添加依赖 <dependen ...

  7. 【小程序开发】 点击button按钮,引导用户授权

    一. 前言 小程序官方文档,上面说明 wx.getUserInfo(OBJECT) 注意:此接口有调整,使用该接口将不再出现授权弹窗,请使用 <button open-type="ge ...

  8. E-R图转换为关系模型

    E-R模型如何转换成关系模型,这里我们分成三种情况进行讲解,分别是一对一,一对多和多对多. 1.一对一的情况: 有两种方法解决这个问题.第一个方法:可以单独对应一个关系模式,由各实体的主码构成关系模式 ...

  9. springcloud报错:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'armeriaServer' defined in class path resource

    spring boot配置zipkin 无法启动 加入 Zipkin Server 由于需要收集 Spring Cloud 系统的跟踪信息,以便及时地发现系统中出现的延迟升高问题并找出系统性能瓶颈的根 ...

  10. spring程序开发步骤

    1.使用spring框架之前的开发步骤 2.使用spring之后的开发步骤 3.文字描述 1.导入Spring开发的基本依赖 2.编写Dao接口和实现类 3.创建spring核心配置文件 4.在spr ...