python实现多线程端口扫描


Posted in Python onAugust 31, 2019

一个简易的TCP端口扫描器,使用python3实现。

需求:扫描目标网站开放哪些端口号,将所有开放的端口号输出。

分析:使用socket连接,如果连接成功,认为端口开放,如果连接失败,认为端口关闭(有可能端口开放但连接失败,这里简单认为端口不开放)

使用到的库:socket, threading

过程:

先定义一个函数,对给定的(ip, port)进行扫描,看其是否能连接成功。

def tcpPortScan(ip, port, openPort):
 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建套接字
 sock.settimeout(0.1)   # 设置延时时间
 try:
  result = sock.connect_ex((ip, port))
  if result == 0:    # 如果连接成功,返回值为0
   openPort.append(port) # 如果端口开放,就把端口port赋给openPort
 except:
  pass
 sock.close()     # 关闭套接字

当需要扫描目标地址的多个端口时,循环使用上述函数的话,扫描速度会极其慢,因为考虑使用多线程。

再定义一个函数,实现多线程扫描。

def threadingPortScan(host, portList, openPorts = []):
 
 hostIP = socket.gethostbyname(host) # 获取域名对应的IP地址
 nloops = range(len(portList))
 threads = []
 
 for i in nloops:
  t = threading.Thread(target=tcpPortScan, args=(hostIP, portList[i], openPorts))
  threads.append(t)
 
 for i in nloops:
  threads[i].start()
 
 for i in nloops:
  threads[i].join()
 return openPorts  # 返回值为该域名下开放的端口列表

完整代码如下:

# -*- coding:utf-8 -*-
'''
使用多线程,检测一个目标地址的端口开放情况,目标地址由用户输入,端口暂时定义为0~1024,
检测TCP连接是否成功,如果连接成功,则端口开放,不成功则端口关闭
'''
 
import socket
import threading
 
def main():
 host = input('please input domain:')
 portList = range(0, 1025)
 openPorts = threadingPortScan(host, portList)
 print(host,'open ports:', openPorts)
 
# 对给定的(ip, port)进行TCP连接扫描
def tcpPortScan(ip, port, openPort):
 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 创建套接字
 sock.settimeout(0.1)   # 设置延时时间
 try:
  result = sock.connect_ex((ip, port))
  if result == 0:
   openPort.append(port) # 如果端口开放,就把端口port赋给openPort
 except:
  pass
 sock.close()     # 关闭套接字
 
 
def threadingPortScan(host, portList, openPorts = []):
 
 hostIP = socket.gethostbyname(host) # 获取域名对应的IP地址
 nloops = range(len(portList))
 threads = []
 
 for i in nloops:
  t = threading.Thread(target=tcpPortScan, args=(hostIP, portList[i], openPorts))
  threads.append(t)
 
 for i in nloops:
  threads[i].start()
 
 for i in nloops:
  threads[i].join()
 return openPorts  # 返回值为该域名下开放的端口列表
 
if __name__ == '__main__':
 main()

使用www.qq.com做一个测试,测试结果如下:

>>>please input domain: www.qq.com
www.qq.com open ports: [80, 843]

总结:这个小程序仅适用于新手练习,不适合真正应用。该简易端口扫描器仅能扫描出一部分端口,有些端口可能因为防火墙拦截导致扫描失败。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python中使用md5sum检查目录中相同文件代码分享
Feb 02 Python
基于Django contrib Comments 评论模块(详解)
Dec 08 Python
对Python 获取类的成员变量及临时变量的方法详解
Jan 22 Python
Python变量访问权限控制详解
Jun 29 Python
python图片二值化提高识别率代码实例
Aug 24 Python
Python的几种主动结束程序方式
Nov 22 Python
关于初始种子自动选取的区域生长实例(python+opencv)
Jan 16 Python
python集成开发环境配置(pycharm)
Feb 14 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
Sep 25 Python
工程师必须了解的LRU缓存淘汰算法以及python实现过程
Oct 15 Python
opencv用VS2013调试时用Image Watch插件查看图片
Jul 26 Python
Python中tqdm的使用和例子
Sep 23 Python
python实现复制大量文件功能
Aug 31 #Python
django 做 migrate 时 表已存在的处理方法
Aug 31 #Python
解决Django中修改js css文件但浏览器无法及时与之改变的问题
Aug 31 #Python
解决Django migrate不能发现app.models的表问题
Aug 31 #Python
python django生成迁移文件的实例
Aug 31 #Python
python实现递归查找某个路径下所有文件中的中文字符
Aug 31 #Python
python+django+rest框架配置创建方法
Aug 31 #Python
You might like
php header()函数使用说明
2008/07/10 PHP
php获取服务器端mac和客户端mac的地址支持WIN/LINUX
2014/05/15 PHP
php中switch与ifelse的效率区别及适用情况分析
2015/02/12 PHP
php实现保存周期为1天的购物车类
2017/07/07 PHP
php和redis实现秒杀活动的流程
2019/07/17 PHP
JS禁用页面上所有控件的实现方法(附demo源码下载)
2015/12/17 Javascript
Node.js实现文件上传
2016/07/05 Javascript
bootstrap table 表格中增加下拉菜单末行出现滚动条的快速解决方法
2017/01/05 Javascript
微信小程序后台解密用户数据实例详解
2017/06/28 Javascript
Vue.js分页组件实现:diVuePagination的使用详解
2018/01/10 Javascript
JavaScript设计模式之命令模式实例分析
2019/01/16 Javascript
vue实现购物车功能(商品分类)
2020/04/20 Javascript
微信小程序 wx:for 与 wx:for-items 与 wx:key的正确用法
2020/05/19 Javascript
使用python实现strcmp函数功能示例
2014/03/25 Python
Python实现二叉树结构与进行二叉树遍历的方法详解
2016/05/24 Python
python的turtle库使用详解
2019/05/10 Python
python之pexpect实现自动交互的例子
2019/07/25 Python
python多进程并发demo实例解析
2019/12/13 Python
通过一张图教会你CSS3倒影的实现
2017/09/26 HTML / CSS
AmazeUI 手机版页面的顶部导航条Header与侧边导航栏offCanvas的示例代码
2020/08/19 HTML / CSS
介绍一下内联、左联、右联
2013/12/31 面试题
物理教育专业毕业生推荐信
2013/11/03 职场文书
编辑求职信样本
2013/12/16 职场文书
幼儿园教师的自我评价范文
2014/09/17 职场文书
企业三严三实学习心得体会
2014/10/13 职场文书
2014年银行年终工作总结
2014/12/19 职场文书
幼儿园大班教师个人总结
2015/02/05 职场文书
城管个人总结
2015/02/28 职场文书
2015年班级工作总结范文
2015/04/03 职场文书
不服劳动仲裁起诉书
2015/05/20 职场文书
病假证明模板
2015/06/19 职场文书
小学数学继续教育研修日志
2015/11/13 职场文书
redis复制有可能碰到的问题汇总
2022/04/03 Redis
Golang MatrixOne使用介绍和汇编语法
2022/04/19 Golang
MySQL脏读,幻读和不可重复读
2022/05/11 MySQL
Docker安装MySql8并远程访问的实现
2022/07/07 Servers