一、背景:
在平时工作中有遇到端口检测,查看服务端特定端口是否对外开放,常用nmap,tcping,telnet等,同时也可以利用站长工具等web扫描端口等。
但是在使用站长工具发现:
- 每次只能输入一个检测的地址;
- 虽然可以输入多个端口,但是不能指定一个端口范围来进行批量检测;
- 没有批量任务记录日志等;
因避免由于局域网检测发起端网络限制而导致的端口检测异常,未使用python-nmap
想通过调用站长工具,实现
- 单次可多个地址或域名检测
- 单词可指定端口范围,批量检测
- 记录日志
二、代码:
2.1 结构
2.2 代码
部分代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
|
#配置文件 #端口检测配置 [port_check_info] #检测ip地址或域名 #address = baidu.com #address = 127.0.0.1 address = www.anchnet.com,www. 51cto .com,www.baidu.com #检查的端口,如多个端口使用,隔开,端口范围使用'-' #ports = 80,8080.... ports = 20 - 25 , 80 , 443 , 1433 , 1521 , 3306 , 3389 , 6379 , 8080 , 27017 #日志配置 [loginfo] #日志目录 logdir_name = logdir #日志文件名称 logfile_name = check_port.log def _get_body( self ): """ 获取address和port :return: list """ address_list = self .address_list.split( ',' ) port_list = self .port_list.split( ',' ) # 处理端口范围,返回range range_flag = false port_range = none content_list_range = [] for port in port_list: if '-' in port: range_flag = true port_range = range ( int (port.split( '-' )[ 0 ]), int (port.split( '-' )[ 1 ]) + 1 ) port_list.remove(port) # 处理总体list for add in address_list: if range_flag: for port in port_range: content_list_range.append(add + ':' + str (port)) # 合并range和普通list content_list = [ add + ':' + port for add in address_list for port in port_list ] content_list_range.extend(content_list) return content_list_range def run( self ): """ 进行端口检测 :return: """ for content in self ._get_body(): content_list = content.split( ':' ) body = { 'host' : content_list[ 0 ], 'port' : content_list[ 1 ], 'encode' : 'tlchs1u3igf4sc57m6kop3oaj1y1kflq' } try : response = requests.post(url = self .url,data = body,headers = self .headers) port_status = re.findall( "msg:'(.*?)'" , response.text) if len (port_status) > 0 : # print('%s,port status is:%s' % (content, port_status)) self .logoper.info( '%s,port status is:%s' % (content, port_status)) else : self .logoper.info( '%s,port status is:%s' % (content, port_status)) # print('occer error!请输入正确的地址和端口') except exception as e: print (e) |
三、测试:
3.1 查看检测结果
此处可以查看51cto的8080端口也是开放的。
3.2 查看日志
四、改进:
- 后期可以添加异步多进程等来提升效率
- 可以对比多个站点检测结果,使结果更准确
- 整合nmap内网也可检测
总结
以上所述是小编给大家介绍的python实现端口检测的方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
原文链接:http://blog.51cto.com/kaliarch/214922