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 时间处理datetime实例
Sep 06 Python
python翻译软件实现代码(使用google api完成)
Nov 26 Python
分析并输出Python代码依赖的库的实现代码
Aug 09 Python
pycharm远程调试openstack代码
Nov 21 Python
详解appium+python 启动一个app步骤
Dec 20 Python
pygame游戏之旅 按钮上添加文字的方法
Nov 21 Python
OpenCV+Python识别车牌和字符分割的实现
Jan 31 Python
pandas实现to_sql将DataFrame保存到数据库中
Jul 03 Python
详解Python中的分支和循环结构
Feb 11 Python
详解python环境安装selenium和手动下载安装selenium的方法
Mar 17 Python
基于python实现获取网页图片过程解析
May 11 Python
python基于tkinter制作m3u8视频下载工具
Apr 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
PHP中的日期及时间
2006/11/23 PHP
php中利用explode函数分割字符串到数组
2014/02/08 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
jquery中输入验证中一个不错的效果
2010/08/21 Javascript
DB.ASP 用Javascript写ASP很灵活很好用很easy
2011/07/31 Javascript
JS子父窗口互相操作取值赋值的方法介绍
2013/05/11 Javascript
jquery 仿锚点跳转到页面指定位置的实例
2017/02/14 Javascript
NodeJs操作MongoDB教程之分页功能以及常见问题
2019/04/09 NodeJs
vue+vuex+json-seiver实现数据展示+分页功能
2019/04/11 Javascript
jquery传参及获取方式(两种方式)
2020/02/13 jQuery
JavaScript装饰者模式原理与用法实例详解
2020/03/09 Javascript
Python中输出ASCII大文字、艺术字、字符字小技巧
2015/04/28 Python
Python的collections模块中的OrderedDict有序字典
2016/07/07 Python
Python使用Selenium模块实现模拟浏览器抓取淘宝商品美食信息功能示例
2018/07/18 Python
使用Python获取并处理IP的类型及格式方法
2018/11/01 Python
Flask核心机制之上下文源码剖析
2018/12/25 Python
python读取文件名并改名字的实例
2019/01/07 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
详解使用python3.7配置开发钉钉群自定义机器人(2020年新版攻略)
2020/04/01 Python
python导入库的具体方法
2020/06/18 Python
Python根据指定文件生成XML的方法
2020/06/29 Python
详解如何在css中引入自定义字体(font-face)
2018/05/17 HTML / CSS
html5-websocket基于远程方法调用的数据交互实现
2012/12/04 HTML / CSS
巴黎卡诗美国官方网站:始于1964年的头发头皮护理专家
2017/07/10 全球购物
全球销量第一生发产品:Viviscal
2017/12/21 全球购物
荷兰在线啤酒店:Beerwulf
2019/08/26 全球购物
Michael Kors英国官网:美国奢侈品品牌
2019/11/13 全球购物
运动会广播稿30字
2014/01/21 职场文书
大家检讨书5000字
2014/02/03 职场文书
弘扬雷锋精神活动演讲稿
2014/03/04 职场文书
公共机构节能宣传周活动总结
2014/07/09 职场文书
授权收款委托书范本
2014/10/10 职场文书
2019商业计划书格式、范文
2019/04/24 职场文书
python3+PyQt5+Qt Designer实现界面可视化
2021/06/10 Python
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android
MySQL数据库超时设置配置的方法实例
2021/10/15 MySQL