1 #coding=utf-8 2 import socket 3 import time 4 import sys 5 6 def portScanner(ip,port): 7 server = (ip,port) 8 sockfd = socket.socket(socket.AF_INET,socket.SOCK_STREAM) 9 sockfd.settimeout(0.5) 10 ret = sockfd.connect_ex(server) #返回0则成功 11 if not ret: 12 sockfd.close() 13 print '%s:%s is opened...' % (ip,port) 14 else: 15 sockfd.close() 16 pass 17 return '' 18 19 def ip2num(ip): 20 lp = [int(x) for x in ip.split('.')] 21 return lp[0] << 24 | lp[1] << 16 | lp[2] << 8 |lp[3] 22 23 def num2ip(num): 24 ip = ['','','',''] 25 ip[3] = (num & 0xff) 26 ip[2] = (num & 0xff00) >> 8 27 ip[1] = (num & 0xff0000) >> 16 28 ip[0] = (num & 0xff000000) >> 24 29 return '%s.%s.%s.%s' % (ip[0],ip[1],ip[2],ip[3]) 30 31 def iprange(ip1,ip2): 32 num1 = ip2num(ip1) 33 num2 = ip2num(ip2) 34 tmp = num2 - num1 35 if tmp < 0: 36 return None 37 else: 38 return num1,num2,tmp 39 40 def scanip(ip): 41 port = 0 42 res = '' 43 while port < 65536: 44 s=socket.socket() 45 address = str(ip) 46 try: 47 s.connect((address,port)) 48 res = res + str(port) + ' ' 49 #print str(port) + ' is opening' 50 except socket.error,e: 51 pass 52 #print str(port) + ' Not Opened' 53 port = port + 1 54 print res 55 56 if __name__ == '__main__': 57 #输出运行时的时间 58 print 'start time : %s' % time.ctime(time.time()) 59 #没有传入参数,打印使用方法 60 if len(sys.argv) == 1: 61 print 'Usage 1:scannerports.py startip endip port (get the specfic given opening port from startip to endip)' 62 print 'Usage 2:scannerports.py destip (get all the opening ports from destip) ' 63 print 'Usage 3:scannerports.py startip endip (get all the opening ports from startip to endip)' 64 sys.exit() 65 #传入了一个参数ip,扫描这个ip打开的端口 66 if len(sys.argv) == 2: 67 ip = sys.argv[1] 68 print str(ip) + ' is scanned...' 69 #调用扫描端口方法 70 scanip(ip) 71 elif len(sys.argv) == 3:#扫描网段内所有ip所有端口 72 res = () 73 startip = sys.argv[1]#网段起始ip 74 endip = sys.argv[2]#网段结束ip 75 res = iprange(startip,endip)#判断网段大小 76 77 if not res: 78 print 'endip must be bigger than startone' 79 sys.exit() 80 elif res[2] == 0:#只有一个ip 81 print str(ip) + ' is scanned...' 82 scanip(ip) 83 else:#循环扫描网段中的每个ip 84 startipn = ip2num(startip) 85 for x in xrange(endip-startip+1): 86 print str(ip) + ' is scanned...' 87 startipnum = startipn + x 88 scanip(num2ip(startipnum))#扫描ip的端口 89 else:#扫描指定网段内的指定端口 90 res = () 91 startip = sys.argv[1]#网段起始ip 92 endip = sys.argv[2]#网段结束ip 93 port = int(sys.argv[3])#指定端口 94 res = iprange(startip,endip)#判断网段大小 95 if not res: 96 print 'endip must be bigger than startone' 97 sys.exit() 98 elif res[2] == 0:#只有一个ip 99 portScanner(startip,port) 100 else:#循环扫描网段中的每个ip 101 startipn = ip2num(startip) 102 for x in xrange(int(res[2])+1): 103 startipnum = startipn + x 104 portScanner(num2ip(startipnum),port)#扫描ip的指定端口 105 print 'end time : %s' % time.ctime(time.time())#输出结束时间 106