现在大多服务器都有做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. 当心,你搞的Scrum可能是小瀑布

    摘要:有的团队刚接触Scrum,一个问题令他们很困扰:迭代初期开发人员的工作较多,测试人员闲着:迭代末期开发人员闲着,测试人员的工作比较多,怎么解决资源等待的问题呢? 本文分享自华为云社区<当心 ...

  2. git和github学习笔记

    1. 了解Git和Github 2. 使用Github 3. Git安装和使用 4. Git基本工作流程 5. Git初始化及仓库创建和操作 6. Git管理远程仓库 7. Github Pages ...

  3. jQuery Validate多实例讲解

    规则 描述 required:true 必须输入的字段. remote:"check.php" 使用 ajax 方法调用 check.php 验证输入值. email:true 必 ...

  4. vue重构--H5--canvas实现粒子时钟

    上一篇文章讲解了如何用js+canvas实现粒子时钟,本篇文章 ,主要是使用vue重构,让它在vue也能使用. 我们使用简单的方式重构,不使用vue工程,先加入vue cdn的地址,如下: <s ...

  5. ubantu14.04搜狗拼音安装

    1. 先卸载fcitx: sudo apt-get purge fcitx*2. 安装fcitx和libssh2-1: sudo apt-get install fcitx 和 sudo apt-ge ...

  6. 牛客网-剑指Offer 二维数组中的查找

    题目描述 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数 ...

  7. string 函数

    传送门:https://www.w3school.com.cn/php/php_ref_array.asp addcslashes() 返回在指定的字符前添加反斜杠的字符串. addslashes() ...

  8. 这个API Hub厉害了,收录了钉钉企业微信等开放Api,还能直接调试

    01 此前时不时会有一些研发小伙伴和我诉苦,说很多企业由于人力财力限制或者需求不强,会直接购买使用第三方的开放API,这样一来, 一则由于开放项目不是量身定制的,寻找自己合适的接口也要搜索调研蛮多时间 ...

  9. 『忘了再学』Shell基础 — 11、变量定义的规则和分类

    目录 1.定义变量的规则 2.变量的分类 1.定义变量的规则 在定义变量时,有一些规则需要遵守 变量名称可以由字母.数字和下划线组成,但是不能以数字开头.如果变量名是2name则是错误的. 在Bash ...

  10. 2021.10.29 P1649 [USACO07OCT]Obstacle Course S(BFS)

    2021.10.29 P1649 [USACO07OCT]Obstacle Course S(BFS) 题意: 给一张n*n的图,起点为A,终点为 B,求从A到B转弯次数最少为多少. 分析: 是否存在 ...