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中实现php的var_dump函数功能
Jan 21 Python
Python实现获取某天是某个月中的第几周
Feb 11 Python
Python实现的微信公众号群发图片与文本消息功能实例详解
Jun 30 Python
Python安装图文教程 Pycharm安装教程
Mar 27 Python
基于python批量处理dat文件及科学计算方法详解
May 08 Python
分析python请求数据
Aug 19 Python
python3.7环境下安装Anaconda的教程图解
Sep 10 Python
python递归函数求n的阶乘,优缺点及递归次数设置方式
Apr 02 Python
Python DataFrame使用drop_duplicates()函数去重(保留重复值,取重复值)
Jul 20 Python
python3通过subprocess模块调用脚本并和脚本交互的操作
Dec 05 Python
python 自动识别并连接串口的实现
Jan 19 Python
matplotlib之属性组合包(cycler)的使用
Feb 24 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
星际RPG字典
2020/03/04 星际争霸
PHP中strtotime函数使用方法分享
2012/01/10 PHP
那些年一起学习的PHP(一)
2012/03/21 PHP
php中return的用法实例分析
2015/02/28 PHP
Prototype Hash对象 学习
2009/07/19 Javascript
jQuery实现id模糊查询的小例子
2013/03/19 Javascript
JS读取XML文件示例代码
2013/11/15 Javascript
jQuery遍历Table应用示例
2014/04/09 Javascript
AngularJS内置指令
2015/02/04 Javascript
JQuery操作元素的css样式
2015/03/09 Javascript
jQuery同步提交示例代码
2015/12/12 Javascript
JavaScript中获取HTML元素值的三种方法
2016/06/20 Javascript
js将table的每个td的内容自动赋值给其title属性的方法
2016/10/13 Javascript
JS实现的数字格式化功能示例
2017/02/10 Javascript
详解基于Vue cli生成的Vue项目的webpack4升级
2018/06/19 Javascript
js防抖和节流的深入讲解
2018/12/06 Javascript
jquery树形插件zTree高级使用详解
2019/08/16 jQuery
vue实现购物车小案例
2019/09/27 Javascript
create-react-app中添加less支持的实现
2019/11/15 Javascript
javascript全局自定义鼠标右键菜单
2020/12/08 Javascript
Python中数字以及算数运算符的相关使用
2015/10/12 Python
详解Python 数据库 (sqlite3)应用
2016/12/07 Python
Python使用装饰器进行django开发实例代码
2018/02/06 Python
搞清楚 Python traceback的具体使用方法
2019/05/13 Python
Python中实现输入超时及如何通过变量获取变量名
2020/01/18 Python
使用Python 自动生成 Word 文档的教程
2020/02/13 Python
python 判断txt每行内容中是否包含子串并重新写入保存的实例
2020/03/12 Python
方太官方网上商城:销售方太抽油烟机、燃气灶、消毒柜等
2017/01/17 全球购物
物理专业本科生自荐信
2014/01/30 职场文书
个人租房协议书
2014/04/09 职场文书
就业意向书
2014/07/29 职场文书
董事长开业致辞
2015/07/29 职场文书
2019年冬至:天冷暖人心的问候祝福语大全
2019/12/20 职场文书
golang判断key是否在map中的代码
2021/04/24 Golang
一篇文章带你了解Python和Java的正则表达式对比
2021/09/15 Python
Redis sentinel哨兵集群的实现步骤
2022/07/15 Redis