当前位置: 首页 > ds >正文

Python程序,输入IP,扫描该IP哪些端口对外是开放的,输出端口列表

#!/usr/bin/env python
# -*- coding: utf-8 -*-"""
IP端口扫描程序
输入IP地址,扫描该IP哪些端口对外是开放的,输出端口列表
"""import socket
import sys
import concurrent.futures
import ipaddress
from tabulate import tabulate
import timedef is_valid_ip(ip):"""验证IP地址是否有效"""try:ipaddress.ip_address(ip)return Trueexcept ValueError:return Falsedef scan_port(ip, port, timeout=1):"""扫描单个端口是否开放参数:ip (str): 目标IP地址port (int): 要扫描的端口timeout (float): 连接超时时间(秒)返回:bool: 如果端口开放返回True,否则返回False"""try:# 创建TCP套接字sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)sock.settimeout(timeout)# 尝试连接result = sock.connect_ex((ip, port))# 关闭套接字sock.close()# 如果连接成功,端口是开放的return result == 0except (socket.error, socket.timeout, OSError):return Falsedef scan_ports(ip, port_range=None, max_workers=100):"""扫描IP地址的多个端口参数:ip (str): 目标IP地址port_range (tuple): 端口范围,格式为(起始端口, 结束端口)max_workers (int): 最大并发线程数返回:list: 开放端口列表"""if port_range is None:# 默认扫描常见端口port_range = (1, 1024)start_port, end_port = port_rangeopen_ports = []total_ports = end_port - start_port + 1print(f"开始扫描 {ip} 的端口 {start_port}-{end_port}...")start_time = time.time()# 使用线程池进行并发扫描with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as executor:# 创建扫描任务future_to_port = {executor.submit(scan_port, ip, port): port for port in range(start_port, end_port + 1)}# 处理完成的任务completed = 0for future in concurrent.futures.as_completed(future_to_port):port = future_to_port[future]completed += 1# 显示进度if completed % 100 == 0 or completed == total_ports:progress = (completed / total_ports) * 100elapsed = time.time() - start_timeprint(f"进度: {completed}/{total_ports} ({progress:.1f}%) - 已用时间: {elapsed:.1f}秒", end="\r")try:if future.result():open_ports.append(port)print(f"\n发现开放端口: {port}")except Exception as e:print(f"\n扫描端口 {port} 时出错: {e}")print(f"\n扫描完成! 总用时: {time.time() - start_time:.1f}秒")return open_portsdef display_open_ports(ip, open_ports):"""显示开放端口列表"""if not open_ports:print(f"\n{ip} 没有发现开放的端口")return# 尝试获取常见端口的服务名称port_info = []for port in sorted(open_ports):try:service = socket.getservbyport(port)except (socket.error, OSError):service = "未知"port_info.append([port, service])# 显示表格print(f"\n{ip} 的开放端口:")headers = ["端口", "可能的服务"]print(tabulate(port_info, headers=headers, tablefmt="grid"))def main():"""主函数"""# 获取用户输入if len(sys.argv) > 1:target_ip = sys.argv[1]else:target_ip = input("请输入要扫描的IP地址: ")# 验证IP地址if not is_valid_ip(target_ip):print(f"错误: '{target_ip}' 不是有效的IP地址")sys.exit(1)# 获取端口范围try:custom_range = input("请输入要扫描的端口范围 (格式: 起始端口-结束端口) [默认: 1-1024]: ")if custom_range:start, end = map(int, custom_range.split('-'))if start < 1 or end > 65535 or start > end:raise ValueErrorport_range = (start, end)else:port_range = (1, 1024)except ValueError:print("错误: 无效的端口范围,使用默认范围 1-1024")port_range = (1, 1024)# 扫描端口open_ports = scan_ports(target_ip, port_range)# 显示结果display_open_ports(target_ip, open_ports)if __name__ == "__main__":try:main()except KeyboardInterrupt:print("\n\n扫描被用户中断")sys.exit(0)except Exception as e:print(f"\n程序执行出错: {e}")sys.exit(1)

http://www.xdnf.cn/news/4807.html

相关文章:

  • Vue生命周期脚手架工程Element-UI
  • 经济体制1
  • http重新为https
  • 基于FPGA婴儿安全监护系统(蓝牙小程序监测)
  • 2025年渗透测试面试题总结-某服面试经验分享(附回答)(题目+回答)
  • R 语言机器学习:为遥感数据处理开启新视角
  • 二元随机响应(Binary Randomized Response, RR)的翻转概率
  • flink超时未揽收单量统计
  • 【AI提示词】马斯洛需求分析专家
  • 【Linux】socket网络编程之UDP
  • cursor平替,试试 vscode+cline+openrouter 的方案,还能自定义 mcp-server 教程大纲
  • 【算法-链表】链表操作技巧:常见算法
  • 元宇宙虚拟展厅如何制作?
  • 华为网路设备学习-21 路由过滤(filter-policy)
  • 微服务不注册到nacos的方法
  • HTML9:页面结构分析
  • 初识Linux · 传输层协议TCP · 上
  • 坐标系与坐标系数转换
  • 接口自动化测试框架详解(pytest+allure+aiohttp+ 用例自动生成)
  • 一文读懂Nginx应用之 HTTP负载均衡(七层负载均衡)
  • 记录微信小程序掉起半屏失效问题
  • 带你玩转 Flink TumblingWindow:从理论到代码的深度探索
  • 使用 CDN 在国内加载本地 PDF 文件并处理批注:PDF.js 5.x 实战指南
  • QMK键盘固件自定义指南 - 打造你的专属键盘体验
  • Python开发之os.path的常用操作
  • Vim 编辑器常用快捷键速查表
  • 排序算法——基数排序
  • 函数级重构:如何写出高可读性的方法?
  • 生产型机器学习系统:静态训练与动态训练的权衡与实践
  • mobile自动化测试-appium webdriverio