一、背景:
在平时工作中有遇到端口检测,查看服务端特定端口是否对外开放,常用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