码迷,mamicode.com
首页 > 编程语言 > 详细

用python编写的简易端口扫描器

时间:2016-07-21 00:28:55      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:

 1 #coding = utf-8
 2 
 3 ‘‘‘
 4 python 3.4
 5 通过简单的TCP端口连接来判断指定IP是否开放了指定端口。
 6 ‘‘‘
 7 
 8 import socket
 9 import optparse
10 import re
11 import threading
12 import sys
13 
14 def anlyze_host(target_host):
15 #将从--host参数获取到的目标值转换为标准的xxx.xxx.xxx.xxx形式,其中主要是利用socket的gethostbyname函数将域名形式的值转换为四位点进制形式
16     try:
17         pattern = re.compile(r\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}) #匹配标准点进制的IP
18         match = pattern.match(target_host)
19         if match:
20             return(match.group())
21         else:
22             try:
23                 target_host = socket.gethostbyname(target_host) #如果不是,就把target_host的值作为域名进行解析
24                 return(target_host)
25             except Exception as err:
26                 print(地址解析错误:,err)
27                 exit(0)
28     except Exception as err:
29         print(请注意错误1:,sys.exc_info()[0],err)
30         print(parser.usage)
31         exit(0)
32                     
33 
34 def anlyze_port(target_port):
35 #解析--port参数传入的值,返回端口列表
36     try:
37         pattern = re.compile(r(\d+)-(\d+))    #解析连接符-模式
38         match = pattern.match(target_port)
39         if match:
40             start_port = int(match.group(1))
41             end_port = int(match.group(2))
42             return([x for x in range(start_port,end_port + 1)])
43         else:
44             return([int(x) for x in target_port.split(,)])
45     except Exception as err:
46         print(请注意错误2:,sys.exc_info()[0],err)
47         print(parser.usage)
48         exit(0)
49 
50 def scanner(target_host,target_port):
51 #创建一个socket对象
52     s = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
53     s.settimeout(5)
54     try:
55         s.connect((target_host,target_port))
56         #s.sendall(b‘hello\r\n\r\n‘)
57         #message = s.recv(100)
58         #if message:
59         print([+]%s的%3s端口:打开 % (target_host,target_port)) #若可以建立连接,表示此端口是打开的
60            # print(‘ %s‘ % message.decode(‘utf-8‘))
61     except socket.timeout:
62         print([-]%s的%3s端口:关闭 % (target_host,target_port)) #如果连接超时,表示此端口关闭
63     except Exception as err:
64         print(请注意错误3:,sys.exc_info()[0],err)
65         exit(0)
66 
67 
68         
69 def main():
70    usage = Usage:%prog -h <host> -p <port>
71    parser = optparse.OptionParser(usage,version=%prog v1.0)
72    parser.add_option(--host,dest=target_host,type=string,
73                      help=需要扫描的主机,域名或IP)
74    parser.add_option(--port,dest=target_port,type=string,
75                     help=需要扫描的主机端口,支持1-100或21,53,80两种形式)
76    (options,args) = parser.parse_args()
77    if options.target_host == None or options.target_port == None:
78       print(parser.usage)
79       exit(0)
80    else:
81       target_host = options.target_host
82       target_port = options.target_port
83 
84    target_host = anlyze_host(target_host)
85    target_port = anlyze_port(target_port)
86 
87    for port in target_port:
88       t = threading.Thread(target=scanner,args=(target_host,port))#多线程扫描端口
89       t.start()
90 
91 if __name__ == __main__:
92    main()  

运行的结果为:

 1 c:\Python34\python.exe TcpScanner.py --host 192.168.2.1 --port 1-1024
 2 [+]192.168.2.1的 25端口:打开
 3 [+]192.168.2.1的110端口:打开
 4 [+]192.168.2.1的119端口:打开
 5 [+]192.168.2.1的143端口:打开
 6 [+]192.168.2.1的465端口:打开
 7 [+]192.168.2.1的563端口:打开
 8 [+]192.168.2.1的587端口:打开
 9 [+]192.168.2.1的993端口:打开
10 [+]192.168.2.1的995端口:打开
11 [+]192.168.2.1的 80端口:打开
12 [-]192.168.2.1的  1端口:关闭
13 [-]192.168.2.1的 18端口:关闭
14 [-]192.168.2.1的  4端口:关闭
15 [-]192.168.2.1的  8端口:关闭
16 [-]192.168.2.1的 13端口:关闭
17 [-]192.168.2.1的  9端口:关闭
18 [-]192.168.2.1的 42端口:关闭
19 [-]192.168.2.1的 19端口:关闭
20 [-]192.168.2.1的 67端口:关闭
21 [-]192.168.2.1的 21端口:关闭
22 [-]192.168.2.1的 14端口:关闭
23 [-]192.168.2.1的 17端口:关闭
24 ……

 

用python编写的简易端口扫描器

标签:

原文地址:http://www.cnblogs.com/darkpig/p/5690127.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!