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中method的参数传递过程
Apr 02 Python
Python sys.argv用法实例
May 28 Python
python中解析json格式文件的方法示例
May 03 Python
Python实现将sqlite数据库导出转成Excel(xls)表的方法
Jul 17 Python
使用Python从零开始撸一个区块链
Mar 14 Python
python使用turtle绘制分形树
Jun 22 Python
pip安装py_zipkin时提示的SSL问题对应
Dec 29 Python
python 对类的成员函数开启线程的方法
Jan 22 Python
Python实现删除排序数组中重复项的两种方法示例
Jan 31 Python
Django框架之DRF 基于mixins来封装的视图详解
Jul 23 Python
python爬取代理ip的示例
Dec 18 Python
Keras在mnist上的CNN实践,并且自定义loss函数曲线图操作
May 25 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/11/06 PHP
php通过字符串调用函数示例
2014/03/02 PHP
启用OPCache提高PHP程序性能的方法
2019/03/21 PHP
PHP使用 Imagick 扩展实现图片合成,圆角处理功能示例
2019/09/09 PHP
第一个JavaScript入门基础 document.write输出
2010/02/22 Javascript
纯js简单日历实现代码
2013/10/05 Javascript
IE下使用jQuery重置iframe地址时内存泄露问题解决办法
2015/02/05 Javascript
jquery对象访问是什么及使用方法介绍
2016/05/03 Javascript
JS面试题---关于算法台阶的问题
2016/07/26 Javascript
jQuery实现获取元素索引值index的方法
2016/09/18 Javascript
最原始的jQuery注册验证方式
2016/10/11 Javascript
JavaScript实现瀑布流图片效果
2017/06/30 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
详解IWinter 一个路由转控制器的 Nodejs 库
2017/11/15 NodeJs
vue 实现的树形菜的实例代码
2018/03/19 Javascript
JavaScript中发出HTTP请求最常用的方法
2018/07/12 Javascript
vue element动态渲染、移除表单并添加验证的实现
2019/01/16 Javascript
微信小程序模板消息限制实现无限制主动推送的示例代码
2019/08/27 Javascript
Vue+Element实现网页版个人简历系统(推荐)
2019/12/31 Javascript
uniapp实现可以左右滑动导航栏
2020/10/21 Javascript
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
python网络爬虫采集联想词示例
2014/02/11 Python
寻找网站后台地址的python脚本
2014/09/01 Python
MySQL中表的复制以及大型数据表的备份教程
2015/11/25 Python
python发送邮件脚本
2018/05/22 Python
python按键按住不放持续响应的实例代码
2019/07/17 Python
python GUI库图形界面开发之PyQt5信号与槽机制、自定义信号基础介绍
2020/02/25 Python
Python 解决相对路径问题:"No such file or directory"
2020/06/05 Python
基于python的opencv图像处理实现对斑马线的检测示例
2020/11/29 Python
Gap工厂店:Gap Factory
2017/11/02 全球购物
环境科学专业求职信
2014/08/04 职场文书
前台接待员岗位职责
2015/04/15 职场文书
国庆阅兵观后感
2015/06/15 职场文书
tensorboard 可视化之localhost:6006不显示的解决方案
2021/05/22 Python
python开发飞机大战游戏
2021/07/15 Python
PostgreSQL解析URL的方法
2021/08/02 PostgreSQL