用Python编写一个开放端口扫描脚本

现在的Ai是真的好用,下面是我编写的开放端口扫描脚本:

# coding:utf-8
# 时间:2024/5/27 上午12:15
# 红客技术网:blog.hongkewang.cnimport socket# 设置目标IP地址
ip = input("请输入需要扫描端口的IP:") # 设置要扫描的端口范围
start_port = 0
end_port = 65535# 设置socket超时时间(秒)
timeout = 0.1# 尝试连接并返回端口状态
def try_connect(ip, port):try:sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(timeout)sock.connect((ip, port))print(f"{ip}:{port} 端口开放")return Trueexcept socket.timeout:print(f"{ip}:{port} 端口关闭(超时)")except ConnectionRefusedError:print(f"{ip}:{port} 端口关闭(连接被拒绝)")except Exception as e:print(f"{ip}:{port} 端口检测时发生错误:{e}")finally:sock.close()return False# 打开文件以追加模式写入,如果文件不存在则创建
# 使用'with'语句确保文件在操作完成后正确关闭
with open('port.txt', 'w') as file:for port in range(start_port, end_port + 1):if try_connect(ip, port):# 如果端口开放,则写入文件并立即刷新缓冲区message = f"{ip}:{port} 端口开放\n"file.write(message)file.flush()  # 强制刷新缓冲区,确保内容实时写入文件print("端口扫描完成。")

下面是文心一言给我优化的:

代码的目的是对给定的IP地址进行全端口扫描(端口号从0到65535),并记录开放端口的信息到一个名为port.txt的文件中。但是,有几个问题和改进点需要指出:

  1. 端口0: 端口0实际上是一个保留端口,用于在绑定套接字时自动选择端口。因此,通常不会尝试连接到端口0。
  2. 异常处理: 在try_connect函数中,如果在try块内没有成功创建sock对象(由于异常),那么在finally块中尝试关闭sock将会导致一个NameError,因为sock没有在这个作用域内被定义。
  3. 效率: 扫描65535个端口将会非常耗时,且在实际网络环境中可能由于触发安全机制而被封锁。通常只对常见的服务端口(如1-1024和某些高端口)进行扫描。
  4. 输出到文件: 虽然你已经使用了with语句来确保文件正确关闭,但在每个成功连接后都调用file.flush()可能不是最高效的做法,因为它会频繁地写入磁盘。更好的做法可能是将所有检测到的开放端口存储在一个列表中,然后在扫描完成后一次性写入文件。
  5. 代码风格: Python中的函数和方法名通常使用小写字母和下划线(snake_case)进行命名。

基于上述点,下面是改进后的代码:

import socketdef try_connect(ip, port):try:with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:sock.settimeout(timeout)sock.connect((ip, port))return Trueexcept socket.timeout:print(f"{ip}:{port} 端口关闭(超时)")except ConnectionRefusedError:print(f"{ip}:{port} 端口关闭(连接被拒绝)")except Exception as e:print(f"{ip}:{port} 端口检测时发生错误:{e}")return Falseip = input("请输入需要扫描端口的IP:")
start_port = 1  # 从1开始,因为0是保留端口
end_port = 65535
timeout = 0.1open_ports = []for port in range(start_port, end_port + 1):if try_connect(ip, port):open_ports.append(port)with open('port.txt', 'w') as file:for port in open_ports:file.write(f"{ip}:{port} 端口开放\n")print("端口扫描完成。")

这样,代码将更健壮、更高效,并且遵循了Python的编码惯例。

原文链接: 用Python编写一个开放端口扫描脚本 - [红客网]编程与渗透技术笔记

红客网(blog.hongkewang.cn)

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

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

相关文章

生成 SSH 证书和私钥

生成 SSH 证书和私钥的过程通常涉及使用 ssh-keygen 命令。以下是生成 SSH 证书和私钥的步骤: 打开终端。 输入 ssh-keygen 命令并按回车。 根据提示设置文件保存位置和对证书的加密密码(可选)。 示例代码: ssh-keygen -t rs…

hashmap 插入1万条数据会有什么影响

在 Java 中,HashMap 是基于哈希表的 Map 接口的非同步实现。当你向 HashMap 中插入大量数据,如 1 万条数据时,会涉及到以下几个方面的影响: 1. 性能 初始插入速度:通常,HashMap 的插入操作非常快&#xf…

RestTemplate使用详解

文章目录 简介基本操作uri参数传递json参数与header参数设置form-dataexchange复杂类型处理上传文件下载文件 简介 对于http请求之前一直用apache的httpclient,已经习惯了,特别是使用fluent之后,更加方便了。 所以一直没有怎么太过关注Rest…

C 语言实例 - 表格形式输出数据

将 1~100 的数据以 10x10 矩阵格式输出。 #include <stdio.h>int main() {int i, j, count;for(i 1; i < 10; i) {for(j i; j <100; j 10 )printf(" %3d", j);printf("\n");}return 0; }运行结果&#xff1a; 1 11 21 31 41 51 61 …

数据库内核-基础知识

常用索引&#xff1a; 介绍&#xff1a; 哈希表&#xff1a;数组加链表&#xff0c;取字段Hash值做Key,B树&#xff1a; 树形结构&#xff0c;排序后N分查找B树&#xff1a; 树形结构&#xff0c;仅叶子结点存放数据跳表索引&#xff1a;链表链表&#xff0c;相当于一级链…

【YashanDB知识库】kettle从DM8的number类型同步到YashanDB的varchar类型,存入是科学计数法形式的数据

【标题】kettle从DM8的number类型同步到YashanDB的varchar类型&#xff0c;存入是科学计数法形式的数据 【问题分类】数据导入导出 【关键字】数据同步&#xff0c;number类型&#xff0c;科学计数法 【问题描述】客户查询不到准确数据&#xff0c;只看到科学计数法展示的字…

【FISCO BCOS 3.0】一、新版本搭链介绍

目录 一、区块链种类的变化 二、搭链演示 1.单群组区块链&#xff08;Air版本&#xff09; 2.多群组区块链&#xff08;Pro版本&#xff09; 3.可扩展区块链&#xff08;Max版本&#xff09; FISCO BCOS的发展速度如日中天&#xff0c;对于稳定的2.0版本而言&#xff0c;偶…

058.最后一个单词的长度

题意 给你一个字符串 s&#xff0c;由若干单词组成&#xff0c;单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大子字符串。 难度 简单 示例 1&#xff1a; 输入&#xff1a;s "Hello World" 输…

Linux通过 SSH 使用 rsync 进行文件传输

目录 目的整体思路ssh建立连接A服务器上的操作输入 ssh-keygen 生成密钥对查看公钥 B服务器上的操作设置公钥认证 A服务器上的操作使用SSH登录进行测试 同步数据知识拓展SSH&#xff08;Secure Shell&#xff09;rsync&#xff08;Remote Sync&#xff09; 目的 使用SSH&#…

JavaWeb基础(一)-IO操作

Java I/O工作机制&#xff1a; 注&#xff1a;简要笔记&#xff0c;示例代码可能较少&#xff0c;甚至没有。 1、Java 的 I/O 类库的基本架构。 ​ Java 的 I/O 操作类在包 java.io 下&#xff0c;大概有将近80个类&#xff0c;这些类大概可以分为如下四组。 基于字节操作的…

UE5中绘制饼状图

饼状图 使用UE绘制前提完整的创建过程123456678 附录代码.h代码.c代码 使用UE绘制前提 EPIC Game使用的版本是Unreal Engine 5.0.3。 没有使用其他额外的插件&#xff0c;使用的是C和Ui共同绘制。 C编译器使用的是VS2019。 完整的创建过程 1 首先在UE中随意一种项目的白色。…

服务器端请求伪造--SSRF

SSRF 简介 ##SSRF定义 SSRF(Server-Side Request Forgery:服务器端请求伪造)是一种由 攻击者构造形成&#xff0c;由服务端发起请求 的一个安全漏洞。一般情况下&#xff0c;SSRF攻击的目标是从 外网无法访问的内部系统&#xff08;正是因为它是由服务端发起的&#xff0c;所…

一个小技巧轻松提升量化精度!IntactKV:保持关键词元无损的大语言模型量化方法

目录 摘要关键词元&#xff08;Pivot Tokens&#xff09;方法概述实验验证1. 权重量化2. KV Cache 量化3. 权重和激活值量化 参考文献 本文介绍我们针对大语言模型量化的工作 IntactKV&#xff0c;可以作为插件有效提升 GPTQ、AWQ、QuaRot 等现有主流量化方法效果。论文作者来自…

海外社媒账号如何运营安全稳定?

由于设备与网络原因&#xff0c;通常一个海外社媒账号尤其是多账号的稳定性都有一定限制&#xff0c;错误的操作或者网络都可能使得账号被封&#xff0c;前功尽弃。本文将为大家讲解如何通过IP代理来维持账号稳定与安全&#xff0c;助力海外社媒矩阵的搭建。 一、社媒账号关联…

C++ ─── string的完整模拟实现

本博客实现了string的常见接口实现 下面是用到的一些函数&#xff0c;供大家回顾复习 string.h #define _CRT_SECURE_NO_WARNINGS 1 #pragma once #include<iostream> #include<assert.h> using namespace std;namespace bit {class string{public:typedef char*…

深入理解计算机系统 家庭作业4.52

练习题4.3 p.254 \sim\seq\seq-full.hcl文件内已经说的很清楚了哪些不能更改,哪些是题目要求更改的控制逻辑块. 依据家庭作业4.51的答案,在seq-full.hcl文件内更改对应的HCL描述即可 以下答案注释了#changed的就是更改部分 #/* $begin seq-all-hcl */ ######################…

Redis 中 Set 数据结构详解

用法 Redis 中的 Set 是一个无序&#xff0c;不重复集合&#xff08;里面的元素为字符串&#xff09;&#xff0c;支持常用的集合操作。 常见命令 1. 增 添加一个或多个元素到 set 中 SADD key member [ member ... ] 返回值&#xff1a; 添加成功的元素个数 将一个元素移到…

数据结构(1):线性表

1 线性表的顺序实现 创建的新项目是cpp类型哦&#xff01; 1.1 初始化 1.1.1 静态分配 #define _CRT_SECURE_NO_WARNINGS#include <stdio.h> #define MaxSize 10 //定义顺序表的长度 typedef struct {int data[MaxSize];//用静态的数组存放元素&#xff01;int lengt…

在Java中实现多线程之间的通信

一、技术难点 在Java中实现多线程之间的通信是一个复杂但重要的任务&#xff0c;它涉及到线程同步、数据共享和线程间协作等多个方面。以下是实现多线程通信时可能遇到的一些技术难点&#xff1a; 线程同步&#xff1a;多线程环境下&#xff0c;多个线程可能同时访问和修改共享…

【UE5.1 角色练习】08-物体抬升、抛出技能 - part2

目录 前言 效果 步骤 一、让物体缓慢的飞向手掌 二、向着鼠标方向发射物体 前言 在上一篇&#xff08;【UE5.1 角色练习】08-物体抬升、抛出技能 - part1&#xff09;的基础上继续完成角色将物体吸向手掌&#xff0c;然后通过鼠标点击的方向来发射物体的功能。 效果 步骤…