Python实现简易端口扫描器代码实例

作者:keepmov 时间:2022-08-07 16:58:24 

在网上的一些资料的基础上自己又添了些新内容,算是Python socket编程练手吧。


#coding=utf-8
import socket
import time
import sys
import struct
import threading
from threading import Thread,activeCount

results=[]
def portScanner(ip,port):
 server = (ip,port)
 sockfd = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
 sockfd.settimeout(0.1)     #设置阻塞模式下socket的超时时间
 ret = sockfd.connect_ex(server) #成功返回0,失败返回error的值。
 if not ret:
   sockfd.close()
   results.append([ip,port])
   #print '%s:%s is opened...' % (ip,port)
 else:
   sockfd.close()
   pass
 return ''

def ip2num(ip):     #将ip地址转换成数字
 lp = [int(x) for x in ip.split('.')]
 return lp[0] << 24 | lp[1] << 16 | lp[2] << 8 |lp[3]

def num2ip(num):
 ip = ['','','','']
 ip[3] = (num & 0xff)
 ip[2] = (num & 0xff00) >> 8
 ip[1] = (num & 0xff0000) >> 16
 ip[0] = (num & 0xff000000) >> 24
 return '%s.%s.%s.%s' % (ip[0],ip[1],ip[2],ip[3])

def iprange(ip1,ip2):
 num1 =socket.ntohl(struct.unpack("I",socket.inet_aton(str(ip1)))[0])
 num2 =socket.ntohl(struct.unpack("I",socket.inet_aton(str(ip2)))[0])
 tmp = num2 - num1
 if tmp < 0:
   return None
 else:
   return num1,num2,tmp

if __name__ == '__main__':

if((len(sys.argv)!= 4)&(len(sys.argv)!= 2)):  #用法说明
   print 'Usage:\n\tscanner.py startip endip port'
   print '\tscanner.py ip'
   sys.exit()

if len(sys.argv)==4:      #对某一IP段的扫描
   time_start=time.time()    #起始时间
   startip = sys.argv[1]    #起始IP
   endip = sys.argv[2]      #结束IP
   port = int(sys.argv[3])    #端口号

res = iprange(startip,endip)
   if not res:
     print 'endip must be bigger than startone'
     sys.exit()
   elif res[2] == 0:
     portScanner(startip,port)
   else:
     for x in xrange(int(res[2])+1):    #IP地址依次递增
       startipnum = ip2num(startip)
       startipnum = startipnum + x
       if activeCount() <=1000:          
         Thread(target=portScanner,args=(num2ip(startipnum),port)).start()

print "There are %d hosts." %len(results)
   results.sort()
   for ip,port in results:
     print "%s:%d is opened..." %(ip,port)
   times=time.time()-time_start      #用时
   print 'use time : %s' % times

if len(sys.argv)==2:
   time_start=time.time()
   port=0
   ip=sys.argv[1]
   while(port<2000):
     if activeCount() <= 40:   #设置40线程扫描
       Thread(target = portScanner, args = (ip, port)).start()
       port=port+1
   results.sort()
   for ip,port in results:
     print "%s:%d is opened..." %(ip,port)
   times=time.time()-time_start
   print 'use time : %s' % times

使用效果如下:

Python实现简易端口扫描器代码实例

Python实现简易端口扫描器代码实例

来源:http://www.cnblogs.com/lovealways/p/6550218.html

标签:python,端口,扫描器
0
投稿

猜你喜欢

  • 深入理解Go语言中的Dispatcher

    2024-02-03 03:27:18
  • Python 列表去重去除空字符的例子

    2021-07-11 02:49:14
  • 全兼容可高亮二级缓冲折叠菜单

    2010-06-03 16:53:00
  • Python通过pytesseract库实现识别图片中的文字

    2021-12-02 14:43:03
  • 经验几则 推荐

    2024-04-22 12:46:14
  • php中json 序列化为 [] 的弊端

    2023-05-25 00:14:30
  • Python configparser模块常用方法解析

    2021-07-08 17:31:11
  • Python3 实现文件批量重命名示例代码

    2023-06-18 00:08:32
  • Python基于BeautifulSoup爬取京东商品信息

    2021-03-15 21:52:53
  • php实现mysql备份恢复分卷处理的方法

    2023-11-16 20:55:33
  • Python fileinput模块使用介绍

    2023-08-22 14:32:12
  • python根据list重命名文件夹里的所有文件实例

    2022-02-12 15:54:30
  • Python 实现图片色彩转换案例

    2021-01-12 21:35:56
  • python多线程+代理池爬取天天基金网、股票数据过程解析

    2023-07-22 12:26:28
  • 如何在python中使用selenium的示例

    2023-07-15 20:52:09
  • "模板化"——限制还是激发

    2009-03-26 11:36:00
  • 在Asp程序中取得表单所有内容的方法

    2010-04-24 16:07:00
  • sql server中错误日志errorlog的深入讲解

    2024-01-23 11:57:58
  • 实现SQL Server到DB2连接服务器很简单

    2010-08-08 15:24:00
  • 如何用python合并多个excel文件

    2022-08-23 19:30:24
  • asp之家 网络编程 m.aspxhome.com