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实现比较两段文本不同之处的方法
May 30 Python
更改Ubuntu默认python版本的两种方法python-> Anaconda
Dec 18 Python
pandas object格式转float64格式的方法
Apr 10 Python
Python基于百度AI的文字识别的示例
Apr 21 Python
Python常见MongoDB数据库操作实例总结
Jul 24 Python
使用python将时间转换为指定的格式方法
Nov 12 Python
python获取Linux发行版名称
Aug 30 Python
python中的线程threading.Thread()使用详解
Dec 17 Python
在tensorflow中实现屏蔽输出的log信息
Feb 04 Python
Tensorflow训练MNIST手写数字识别模型
Feb 13 Python
利用 Python ElementTree 生成 xml的实例
Mar 06 Python
在python下实现word2vec词向量训练与加载实例
Jun 09 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判断浏览器的类型和语言的函数代码
2013/02/28 PHP
php中调用其他系统http接口的方法说明
2014/02/28 PHP
js 实现无缝滚动 兼容IE和FF
2009/07/15 Javascript
正负小数点后两位浮点数实现原理及代码
2013/09/06 Javascript
ExtJS4 动态生成的grid导出为excel示例
2014/05/02 Javascript
jquery ajax请求方式与提示用户正在处理请稍等
2014/09/01 Javascript
jQuery中andSelf()方法用法实例
2015/01/08 Javascript
简介JavaScript中的unshift()方法的使用
2015/06/09 Javascript
浅析javascript中的事件代理
2015/11/06 Javascript
jQuery如何防止Ajax重复提交
2016/10/14 Javascript
原生JS下拉加载插件分享
2016/12/26 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
js select下拉联动 更具级联性!
2020/04/17 Javascript
bootstrap table实例详解
2017/01/06 Javascript
javascript删除html标签函数cIsHTML
2017/01/09 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
微信小程序 动态绑定数据及动态事件处理
2017/03/14 Javascript
如何解决vue与传统jquery插件冲突
2017/03/20 Javascript
jquery 禁止鼠标右键并监听右键事件
2017/04/27 jQuery
利用vscode编写vue的简单配置详解
2017/06/17 Javascript
详解vue 兼容IE报错解决方案
2018/12/29 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
2019/01/27 jQuery
前端Vue项目详解--初始化及导航栏
2019/06/24 Javascript
layui表格分页 记录勾选的实例
2019/09/02 Javascript
Node.js API详解之 querystring用法实例分析
2020/04/29 Javascript
Python的Django框架中模板碎片缓存简介
2015/07/24 Python
详解Python 序列化Serialize 和 反序列化Deserialize
2017/08/20 Python
Python3调用微信企业号API发送文本消息代码示例
2017/11/10 Python
python实现狄克斯特拉算法
2019/01/17 Python
Python实现二叉搜索树BST的方法示例
2019/07/30 Python
numpy中生成随机数的几种常用函数(小结)
2020/08/18 Python
聊聊python中的异常嵌套
2020/09/01 Python
毕业生幼师求职自荐信
2013/10/01 职场文书
初三政治教学反思
2014/01/30 职场文书
财务经理岗位职责范本
2015/04/08 职场文书
sass 常用备忘案例详解
2021/09/15 HTML / CSS