python编写的端口扫描脚本

 实训项目制作的端口扫描脚本

附有详细的使用命令解释

可以实现单个端口进行扫描和端进行扫描

eg:1-65535

import optparse  # 导入用于解析命令行参数的模块
import socket  # 导入用于网络通信的模块

# 定义函数:扫描指定主机的指定端口
def PortScan(targetHost, targetPort):
    try:
        connSkt = socket.socket(socket.AF_INET, socket.SOCK_STREAM)  # 创建套接字对象,   # socket.AF_INET 表示地址族(Address Family),用于指定套接字使用的地址类型,这里是 IPv4 地址族。
                                                                                        # socket.SOCK_STREAM 表示套接字类型(Socket Type),用于指定套接字的传输类型,这里是 TCP。
        connSkt.settimeout(1)  # 设置连接超时时间为 1 秒
        connSkt.connect((targetHost, targetPort))  # 尝试连接指定的主机和端口
        connSkt.send(b'PortScan\r\n')  # 发送字节数据到连接的套接字
        results = connSkt.recv(1000)  # 接收数据并存储结果
        print('[+] %d/tcp open' % targetPort)  # 输出端口开放信息
        print('[+] ' + str(results))  # 输出收到的数据
    except socket.error:
        print('[-] %d/tcp closed' % targetPort)  # 端口关闭或发生错误时输出信息
    finally:
        connSkt.close()  # 关闭套接字连接

# 定义函数:执行端口扫描
def Scan(targetHost, targetPorts):
    try:
        tgtIP = socket.getaddrinfo(targetHost, 0)[0][4][0]  # 获取目标主机的 IP 地址,socket.getaddrinfo(targetHost, 0) 返回一个包含解析信息的列表。
    except socket.gaierror:
        print('[-] Cannot resolve %s: Unknown host' % targetHost)  # 若无法解析主机名则输出错误信息并返回
        return
    try:
        tgtName = socket.gethostbyaddr(tgtIP)[0]    # 获取 IP 地址对应的主机名
                                                    # socket.gethostbyaddr() 函数用于执行 IP 地址到主机名的反向 DNS 解析。它接受一个 IP 地址作为参数,并返回与该地址关联的主机名。
        print("\n[+] Scan results for: " + tgtName)  # 输出扫描结果的主机名
    except socket.herror:                       # 表示与主机和网络相关的错误。
        print("Scan Results for: " + tgtIP)  # 若无法获取主机名则输出 IP 地址
    for targetPort in targetPorts:  # 遍历指定的端口列表
        print("Scanning port: " + str(targetPort))  # 输出当前正在扫描的端口
        PortScan(targetHost, int(targetPort))  # 调用 PortScan 函数扫描各个端口

# 解析端口范围参数
def parse_port_range(port_range):
    ports = []
    try:
        if "-" in port_range:
            start, end = port_range.split("-")      #split("-") 方法通过分隔符 "-" 将字符串 port_range 拆分成两部分,左侧部分是起始端口,右侧部分是结束端口。这两部分被赋值给 start 和 end 变量。
            for port in range(int(start), int(end) + 1):
                ports.append(port)
        else:
            ports.append(int(port_range))
    except ValueError:
        print("Invalid port range specified. Please use format 'start-end' or 'port'.")
        exit(0)
    return ports

# 主函数
def main():
    parser = optparse.OptionParser("Usage prog -H <target host> -p <target ports>")        # 是 Python 中用于解析命令行参数的模块。它允许您编写带有选项和参数的命令行接口,并解析用户提供的输入
    parser.add_option('-H', dest='targetHost', type='string', help='specify target host')   # add_option() 方法用于添加选项,
                                                                                            # dest 参数用于指定选项被解析后存储的目标属性名称。当用户在命令行中使用选项时,解析器会将解析后的值存储到指定的目标属性中。
                                                                                            # type 参数用于指定在解析命令行参数时所期望的数据类型。这个参数允许您告诉解析器应该将参数解析为何种数据类型。
                                                                                            # string 是一个数据类型或一个表示字符类型的字符串
    parser.add_option('-p', dest='targetPort', type='string', help='specify target port[s] inside \"\" separated by commas(1-65535)')
    (options, args) = parser.parse_args()               #parse_args() 方法用于解析命令行参数,并返回解析后的结果。
    targetHost = options.targetHost  # 获取目标主机
    port_range = options.targetPort  # 获取端口范围参数

    if (targetHost is None) or (port_range is None):  # 如果未提供目标主机或端口范围,则输出用法信息并退出程序
        print(parser.usage)                     # parser.usage 是一个属性,用于获取程序使用说明的自定义文本。
        exit(0)

    targetPorts = parse_port_range(port_range)  # 解析端口范围参数

    Scan(targetHost, targetPorts)  # 调用 Scan 函数执行端口扫描

# 程序入口
if __name__ == "__main__":
    main()  # 调用主函数开始执行端口扫描
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634702.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Vue透传 Attributes的代码以及总结

//透传简单来说就是在子组件写style,class或者函数可以将它们&#xff0c;自动直接传递给 template&#xff1a;里面的单个节点。 //多个节点透传的自动传递会生效&#xff0c;如果在节点中像使用&#xff0c;那么就需要在对应的节点中写像:style"$attrs.style"的形…

LabVIEW精确测量产品中按键力和行程

项目背景 传统的按键测试方法涉及手工操作&#xff0c;导致不一致和效率低下。在汽车行业中&#xff0c;带有实体按键的控制面板非常常见&#xff0c;确保一致的按键质量至关重要。制造商经常在这些组件的大规模、准确测试中遇到困难。显然&#xff0c;需要一个更自动化、精确…

Kubernetes (十四) 调度策略

一. 调度策略 二. 调度方法 nodeName 创建pod配置文件 vim nodename.yaml apiVersion: v1 kind: Pod metadata: name: nginx labels…

23 SEMC外扩SDRAM

文章目录 23.1 SDRAM 控制原理23.2 SEMC 简介 23.1 SDRAM 控制原理 RT1052 系列芯片扩展内存时可以选择 SRAM 和 SDRAM 由于 SDRAM 的“容量/价格”比较高&#xff0c;即使用 SDRAM 要比 SRAM 要划算得多。 给 RT1052 芯片扩展内存与给 PC 扩展内存的原理是一样的 PC 上一般…

【计算机网络】HTTP协议以及简单的HTTP服务器实现

文章目录 一、HTTP协议1.认识URL2.urlencode和urldecode3.HTTP协议格式4.HTTP的方法5.HTTP的状态码6.HTTP常见Header7.重定向8.长连接9.会话保持10.基本工具 二、简单的HTTP服务器实现1.err.hpp2.log.hpp3.procotol.hpp4.Sock.hpp5.Util.hpp6.httpServer.hpp7.httpServer.cc8.总…

网络编辑day4

思维导图 广播模型发送端-->类似于UDP客户端 #include<head.h> int main(int argc, const char *argv[]) {//1、创建套接字int sfdsocket(AF_INET,SOCK_DGRAM,0);if(sfd-1){perror("socket error ");return -1;}//2、将套接字设置成允许广播int broadcast1…

2023年山东省职业院校技能大赛高职组信息安全管理与评估 模块二(正式赛)

2023年山东省职业院校技能大赛高职组信息安全管理与评估 模块二 模块二竞赛项目试题 根据信息安全管理与评估技术文件要求&#xff0c;模块二为网络安全事件响应、数字取证调查和 应用程序安全。本文件为信息安全管理与评估项目竞赛-模块二试题。 介绍 竞赛有固定的开始和结…

0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC

0.96寸OLED-单独驱动和U8g2驱动-硬件软件IIC 博主平时DIY经常使用OLED&#xff0c;其中以4脚的I2C屏最多&#xff0c;就想着总结一下子&#xff0c;让广大DIY朋友更容易找到资源。 驱动采用的时SSD1306 同学们拿到代码后&#xff0c;可以直接用&#xff0c;其中博主给的代码默认…

Windows 常用快捷键

文章目录 前言Win R&#xff1a;打开运行窗口Win D&#xff1a;显示桌面。Win E&#xff1a;打开资源管理器。Ctrl Shift Esc&#xff1a;打开任务管理器。Alt Tab&#xff1a;切换当前打开的窗口。F2&#xff1a;重命名选定的文件或文件夹。Ctrl W&#xff1a;关闭当前…

学习响应式编程中遇到的奇奇怪怪的问题

spring项目无法启动 Description: Web application could not be started as there was no org.springframework.boot.web.reactive.server.ReactiveWebServerFactory bean defined in the context. Action: Check your application’s dependencies for a supported react…

【GitHub项目推荐--AI杀入斗地主领域】【转载】

AlphaGo&#xff1a;第一个战胜围棋世界冠军的人工智能机器人。 我不会玩围棋&#xff0c;没办法和 AlphaGO 对局。但是我喜欢玩斗地主&#xff0c;有斗地主人工智能机器人吗&#xff1f; 有&#xff0c;而且还开源了。DouZero&#xff1a;快手团队开发的斗地主AI。别的不说&…

文件共享服务(一)——DAS、NAS、SAN存储类型

一、存储类型 存储类型主要有三种 1. DAS直连式存储 通常由数据线直连电脑就可以用&#xff0c;比如一块新硬盘&#xff0c;只需要利用磁盘模拟器分区&#xff0c;创建文件系统&#xff0c;挂载就可以使用了。 PC中的硬盘或只有一个外部SCSI接口的JBOD存储设备&#xff08;即…

编程框架概述:MVC, MVP, MVVM, Flux/Redux, 和 Clean Architecture

前言 在软件开发中&#xff0c;选择合适的编程框架和架构模式对于构建可维护和可扩展的应用程序至关重要。初学者在面对多种架构选项时可能会感到困惑。本文将详细介绍五种流行的编程框架&#xff1a;MVC、MVP、MVVM、Flux/Redux和Clean Architecture。 MVC&#xff08;Model-V…

1. JDBC 连库操作的基本流程

根据Mysql JDBC基本操作&#xff0c;我们大概可以总结出JDBC的API。 Driver &#xff1a;jdbc驱动DriverManager&#xff1a;驱动注册类&#xff0c;创建Connection连接Connection&#xff1a;物理连接Statement、PreparedStatement&#xff1a;sql语句ResultSet&#xff1a;结…

【前端学习笔记1】css基础

css可以使页面更漂亮&#xff0c;即美化网页 css&#xff1a;层叠样式表 标签选择器&#xff1a; 类选择器&#xff1a; id只能单次调用&#xff0c;类似人的身份证 css里只要是word里面有的功能&#xff0c;他们都有对应的&#xff0c;不会的时候查一下就行 实现垂直居中:h…

[java数据结构] ArrayList和LinkedList介绍与使用

目录 (一) 线性表 (二) ArrayList 1. ArrayList的介绍 2. ArrayList的常见方法和使用 3. ArrayList的遍历 4. ArrayList的模拟实现 5. ArrayList的优缺点 (三) LinkedList 1. LinkedList的介绍 2. LinkedList的常见方法和使用 3. LinkedList的遍历 4. LinkedList的…

Spring Boot应用程序如何配置 HTTPS 访问方式

在 Spring Boot 应用程序中配置 HTTPS 访问方式可以根据你是否拥有由受信任的证书颁发机构&#xff08;CA&#xff09;签发的证书来分为两种情况&#xff1a;使用自签名证书和使用 CA 签发的证书。下面我将分别介绍这两种情况的配置方法&#xff1a; 使用自签名证书 如果你还…

力扣每日一练(24-1-18)

经验一&#xff1a;不要把问题想复杂 Python&#xff1a; min_price float(inf)max_profit 0for price in prices:min_price min(min_price, price)max_profit max(max_profit, price - min_price)return max_profit C#&#xff1a; public int MaxProfit(int[] prices) {i…

强化学习(二)多臂老虎机 “Multi-armed Bandits”——1

将强化学习与机器学习、深度学习区分开的最重要的特征为&#xff1a;它通过训练中信息来评估所采取的动作&#xff0c;而不是给出正确的动作进行指导&#xff0c;这极大地促进了寻找更优动作的需求。 1、多臂老虎机&#xff08;Multi-armed Bandits&#xff09;问题 赌场的老虎…

WPF入门到跪下 第十一章 Prism(一)数据处理

官网&#xff1a;https://primslibrary.com 源码地址&#xff1a;https://guthub.com/PrismLibrary/prism Prism是由微软发布、维护的开源框架&#xff0c;提供了一组设计模式的实现&#xff0c;有助于编写结构良好的且可维护的XAML应用程序&#xff0c;包括MVVM、依赖注入、命…