python实现多线程端口扫描
作者:sime_km 发布时间:2021-07-06 03:27:26
标签:python,多线程,端口扫描
一个简易的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]
总结:这个小程序仅适用于新手练习,不适合真正应用。该简易端口扫描器仅能扫描出一部分端口,有些端口可能因为防火墙拦截导致扫描失败。
来源:https://blog.csdn.net/sime_km/article/details/79747334


猜你喜欢
- vue-cli使用stimulsoft.reports.js(保姆级教程)第一部分:数据源准备以下是JSON数据的教程json数据结构{&q
- 应用程序慢如牛,原因多多,可能是网络的原因、可能是系统架构的原因,还有可能是数据库的原因。那么如何提高数据库SQL语句执行速度呢?有人会说性
- 一.背景: 当数据量过大时,一个程序的执行时间就会主要花费在等待单次查询返
- 楔子我们知道python的执行效率不是很高,而且由于GIL的原因,导致python不能充分利用多核CPU。一般的解决方式是使用多进程,但是多
- 原文地址:30 Days of Mootools 1.2 Tutorials - Day 12 - Drag and Drop using
- 有些 MySQL 数据表中可能存在重复的记录,有些情况我们允许重复数据的存在,但有时候我们也需要删除这些重复的数据。本章节我们将为大家介绍如
- 最近我遇到了一个 bug,我试着通过 Rails 在以“utf8”编码的 MariaDB 中保存一个 UTF-8 字符串,然后出现了一个离奇
- 阅读上一篇:你是真正的用户体验设计者吗? Ⅵ很可怕,是吧!图中翻译:(从内到外)第一层:用户体验第二层:内容管理界面设计顾客关系管理交互设计
- import os import sys import string #以指定模式打开指定文件,获取文件句柄 def getFileIns(
- 下面是代码,如果看不懂,建议先把表格的一些<tr><td>的表格原理弄清楚了,就可以了代码如下:<table&
- 【尊重原创,转载请注明出处】https://blog.csdn.net/guyuealian/article/details/7967225
- NextGEN Gallery是Wordpress中著名的相册插件,遗憾的是不支持中文等unicode字符,本文将介绍如何将目录转换为拼音(
- 本文实例讲述了Python实现的数据结构与算法之快速排序。分享给大家供大家参考。具体分析如下:一、概述快速排序(quick sort)是一种
- Python字典的创建方法一:>>> blank_dict = {}>>> product_dict =
- 前言不管是哪门语言,千变万化不离其宗,深入理解其本质,方能应用自如。对应到js,闭包,原型,函数,对象等是需要花费大功夫思考、理解的。本文穿
- 刚刚登甲发来一个文章,看到只要一行代码,就可以把IE6弄死.<style>*{position:relative}&
- 01.简介当我们使用的鱼眼镜头视角大于160°时,OpenCV中用于校准镜头“经典”方法的效果可能就不是和理想了。即使我们仔细遵循OpenC
- 本文实例讲述了Python enumerate函数功能与用法。分享给大家供大家参考,具体如下:eunmerate在英文中是列举、枚举的意思,
- 测试方法首先使用implode, serialize, json_encode, msgpack_pack创建四个文本文件,用于测试。创建代
- 在做维护项目的时,我们经常会遇到索引维护的问题,通过语句,我们就可以判断某个表的索引是否需要重建。 执行一下语句:先分析表的索引 分析表的索