SSH自动升级工具
一个专业的OpenSSH自动检测和升级工具,支持守护进程模式和systemd服务管理
- 项目地址: https://gitee.com/liumou_site/ssh-automatic-upgrade
- PyPI地址: https://pypi.org/project/ssh-auto-upgrade
- 最新版本:
- 下载量:
📖 项目简介
SSH自动升级工具是一个专为Linux系统管理员设计的自动化工具,能够自动检测OpenSSH最新版本、下载源码、编译安装,并支持注册为systemd守护进程服务。工具采用模块化设计,具有良好的可扩展性和稳定性。
✨ 核心特性
- 🔍 智能版本检测 - 自动从OpenSSH官方源检测最新版本
- 📥 可靠下载机制 - 支持断点续传、进度显示和文件完整性验证
- 🛡️ 安全安装流程 - 包含安装前验证、回滚机制和错误处理
- 🔧 系统服务管理 - 支持systemd服务注册、启动、停止和管理
- 📋 依赖自动管理 - 智能检测和安装编译所需的系统依赖
- 📊 详细日志记录 - 完整的安装过程日志和状态监控
- 🔄 循环日志系统 - 智能日志文件轮转,防止磁盘空间耗尽
- 🎯 模块化架构 - 清晰的代码结构,易于维护和扩展
- ⚡ 智能检测机制 - 多维度系统状态检测和验证
- 🛡️ 参数验证系统 - 完善的输入验证和安全检查
- 🔐 升级后连接验证 - 临时账号自动创建,验证升级后SSH连接功能
🏗️ 系统架构
ssh_auto_upgrade/
├── 📁 src/ssh_auto_upgrade/
│ ├── 🚀 main.py # 主程序入口,守护进程模式
│ ├── 🔄 daemon_loop.py # 守护进程主循环模块
│ ├── 🔍 version_detector.py # 版本检测模块
│ ├── 📥 downloader.py # 下载器模块
│ ├── 🛠️ installer.py # 安装器核心模块
│ ├── ⚙️ installer_service_manager.py # 安装器服务管理
│ ├── 📂 installer_file_manager.py # 安装器文件管理
│ ├── 🔍 installer_service_detector.py # 安装器服务检测模块
│ ├── 🔧 service_manager.py # systemd服务管理(D-Bus API)
│ ├── 🛠️ service_registrar.py # 服务注册模块
│ ├── 📋 dependencies.py # 依赖管理模块
│ ├── 📝 dependency_constants.py # 依赖常量定义
│ ├── 📊 logger.py # 日志记录模块(支持循环日志)
│ ├── 🔨 compile.py # 传统编译脚本(兼容模式)
│ ├── 🧹 legacy_cleaner.py # 遗留文件清理模块
│ ├── 🔍 mirror_checker.py # 镜像源检查模块
│ ├── 🔍 service_detector.py # 服务检测模块
│ ├── 🔍 systemd_checker.py # systemd检查模块
│ ├── 🔍 time_checker.py # 时间检查模块
│ ├── 🔍 port_checker.py # 端口检查模块
│ ├── 🔐 temp_account_validator.py # 临时账号验证模块
│ ├── ⚙️ ssh_config_manager.py # SSH配置管理
│ ├── 📊 ssh_config_manager_status.py # SSH配置状态管理
│ ├── ✅ argument_validator.py # 参数验证模块
│ ├── 📊 arg.py # 参数定义模块
│ └── 📦 __init__.py # 包初始化文件
├── 📄 pyproject.toml # 项目配置和打包信息
├── 📄 requirements.txt # Python依赖列表
├── 📄 ssh-auto-upgrade.py # 命令行入口脚本
├── 📄 test_temp_validator.py # 临时账号验证测试
├── 📄 test_service_manager.py # 服务管理测试
├── 📄 test_systemd_python.py # systemd Python集成测试
└── 📄 其他测试和构建文件
🔄 工作流程
守护进程模式完整流程
graph TD
A[启动程序] --> B[权限检查]
B --> C[参数验证]
C --> D[systemd检查]
D --> E[镜像源检测]
E --> F[依赖检查]
F --> G{服务注册模式?}
G -->|是| H[注册systemd服务]
G -->|否| I[进入守护循环]
H --> J[退出程序]
I --> K[时间段检查]
K -->|在时间段内| L[版本检测]
K -->|不在时间段内| M[等待1小时]
L --> N{需要升级?}
N -->|是| O[停止SSH服务]
N -->|否| M
O --> P[下载源码]
P --> Q[编译安装]
Q --> R[验证安装]
R --> S[重启SSH服务]
S --> T[配置root登录]
T --> U[临时账号创建]
U --> V[SSH连接测试]
V --> W{连接成功?}
W -->|是| X[清理临时账号]
W -->|否| Y[重启SSH服务]
Y --> Z[重试连接]
Z --> W
X --> AA[升级后验证完成]
AA --> M
M --> I
-
系统初始化检查
- 权限验证 → 检查root权限(必需)
- 参数验证 → 验证命令行参数格式和组合
- systemd检查 → 确保系统支持systemd
- 镜像源检测 → 验证OpenSSH镜像源可用性
-
依赖环境准备
- 编译依赖检查 → 检测gcc、make、autoconf等编译工具
- 自动安装缺失依赖 → 使用系统包管理器安装
- 依赖验证 → 确保所有编译环境就绪
-
服务注册模式(如果指定--service参数)
- systemd服务创建 → 生成systemd服务单元文件
- 服务注册 → 注册到systemd并设置开机自启
- 服务配置 → 配置服务参数和工作目录
-
守护进程主循环(非服务注册模式)
- 时间段检查 → 验证当前时间是否在允许升级的时间段
- 版本检测 → 检查当前OpenSSH版本和最新可用版本
- 升级决策 → 根据版本对比和force参数决定是否升级
-
OpenSSH升级流程(当需要升级时)
- 服务停止 → 停止SSH守护服务(CLS、xc-ssh等)
- 原生服务禁用 → 禁用系统原生SSH服务避免端口冲突
- 源码下载 → 从镜像源下载OpenSSH源码包
- 编译安装 → 配置、编译并安装到指定目录
- 安装验证 → 验证新版本安装是否成功
- 服务重启 → 重新启动SSH服务和守护服务
- 配置更新 → 根据参数设置root登录权限
- 临时账号创建 → 自动生成临时测试账号
- 连接验证 → 使用临时账号测试SSH连接功能
- 失败重试 → 连接失败时自动重启服务并重试
- 清理清理 → 验证完成后删除临时账号
- 遗留清理 → 清理旧版本文件和启动脚本
-
升级后验证流程
- 创建临时账号 → 生成随机用户名和密码
- SSH连接测试 → 使用临时账号建立SSH连接
- 验证结果判断 → 成功则清理账号,失败则重试
- 自动重试机制 → 连接失败时重启SSH服务再试
- 安全清理 → 无论成功失败都会清理临时账号
-
循环等待
- 时间检查 → 每小时检查一次是否在升级时间段
- 日志记录 → 记录所有操作和状态变化
- 异常处理 → 处理网络、权限、依赖等异常情况
🔍 工作流程关键改进
相比传统升级工具的核心优势:
-
智能时间控制
- 支持时间段限制(
--start-time和--end-time) - 避免在业务高峰期进行升级操作
- 每小时检查一次,确保在安全时间段内执行
- 支持时间段限制(
-
服务兼容性处理
- 自动检测并停止CLS、xc-ssh等SSH守护服务
- 智能禁用系统原生SSH服务避免端口冲突
- 升级完成后自动恢复所有服务
-
升级后连接验证(版本1.0.23+)
- 自动验证 → 升级完成后自动创建临时账号测试SSH连接
- 安全保障 → 使用随机生成的临时账号,验证后立即删除
- 智能重试 → 连接失败时自动重启SSH服务并重新验证
- 详细日志 → 提供完整的验证过程日志记录
- 非阻塞设计 → 验证失败不影响升级完成,只记录警告
-
异常安全机制
- 完整的依赖检查和自动修复
- 安装失败自动回滚机制
- 服务状态验证确保升级成功
- 循环日志系统防止磁盘空间耗尽
- 升级失败时的详细错误诊断和日志记录
-
参数验证系统
- 严格的命令行参数格式验证
- 参数组合逻辑检查
- 友好的错误提示信息
-
镜像源智能检测
- 自动检测阿里云镜像源可用性
- 支持版本号解析和排序
- 网络异常重试机制
🚀 快速开始
系统依赖安装
在安装Python包之前,请确保系统已安装必要的编译依赖:
# Ubuntu/Debian 系统
sudo apt update
sudo apt install libsystemd-dev libdbus-1-dev libglib2.0-dev pkg-config
# CentOS/RHEL系统
sudo yum install systemd-devel dbus-devel glib2-devel pkgconfig
# 或者使用 dnf (CentOS 8+/RHEL 8+)
sudo dnf install systemd-devel dbus-devel glib2-devel pkgconfig
方法一:通过PyPI安装(推荐)
# 使用pip3并添加清华大学镜像源加速安装
pip3 install ssh-auto-upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple/
方法二:开发模式安装(从源码安装)
# 开发模式安装,便于修改代码,使用清华大学镜像源
pip3 install -e . -i https://pypi.tuna.tsinghua.edu.cn/simple/
升级到最新版本
# 使用清华大学镜像源升级到最新版本
pip3 install --upgrade ssh-auto-upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple/
卸载工具
pip3 uninstall ssh-auto-upgrade
⚙️ 使用说明
命令行参数
# 查看所有选项
ssh-auto-upgrade --help
# 基本用法示例
ssh-auto-upgrade
# 自定义镜像源
ssh-auto-upgrade --mirror https://mirrors.aliyun.com/openssh/portable/
# 自定义安装目录
ssh-auto-upgrade --install-dir /usr/local/openssh
# 自定义下载目录
ssh-auto-upgrade --download-dir /tmp/ssh-upgrade
# 自定义日志目录
ssh-auto-upgrade --log-dir /var/log/ssh-auto-upgrade
# 强制升级(即使版本相同也执行安装)
ssh-auto-upgrade --force
# 注册为systemd服务(需要root权限)
ssh-auto-upgrade --service
# 设置升级时间段(默认00:00:00-08:00:00)
ssh-auto-upgrade --upgrade-time 00:00:00-08:00:00
# 设置跨天时间段
ssh-auto-upgrade --upgrade-time 22:00:00-06:00:00
# 智能检测root登录配置(默认)
ssh-auto-upgrade --root-login auto
# 强制启用root登录
ssh-auto-upgrade --root-login yes
# 强制禁用root登录
ssh-auto-upgrade --root-login no
# 使用简化参数设置root登录
ssh-auto-upgrade -rl yes
ssh-auto-upgrade -rl no
# 设置仅密钥登录
ssh-auto-upgrade --key-only-login yes
ssh-auto-upgrade -kl no
# 设置检测间隔时间(小时)
ssh-auto-upgrade --check-interval 6
# 设置SSH服务端口
ssh-auto-upgrade --ssh-port 2222
ssh-auto-upgrade -p 2222
# 启用调试模式
ssh-auto-upgrade --debug
# 清理并重新生成SSH私钥
ssh-auto-upgrade --clean-keys
ssh-auto-upgrade -sk
# 跳过依赖检查
ssh-auto-upgrade --skip-dependencies
ssh-auto-upgrade -sd
# 组合使用示例
ssh-auto-upgrade --force --upgrade-time 00:00:00-08:00:00 --root-login yes
ssh-auto-upgrade --service --mirror https://mirrors.aliyun.com/openssh/portable/ -rl no --ssh-port 2222
ssh-auto-upgrade --force --clean-keys --skip-dependencies --upgrade-time 22:00:00-06:00:00
参数说明
| 参数 | 短参数 | 默认值 | 说明 |
|---|---|---|---|
--mirror |
-m |
https://mirrors.aliyun.com/openssh/portable/ |
OpenSSH镜像源URL |
--install-dir |
-i |
/usr/local/openssh |
OpenSSH安装目录 |
--download-dir |
-d |
/tmp/ssh-upgrade |
下载目录 |
--log-dir |
-l |
/var/log/ssh-auto-upgrade |
日志目录 |
--force |
-f |
false |
强制升级,即使版本相同也执行安装 |
--service |
-s |
false |
注册为systemd服务 |
--upgrade-time |
-t |
00:00:00-08:00:00 |
升级时间段,格式为 HH:MM:SS-HH:MM:SS |
--root-login |
-rl |
auto |
root登录配置:auto(智能检测), yes(启用), no(禁用) |
--key-only-login |
-kl |
auto |
仅密钥登录配置:auto(智能检测), yes(启用仅密钥登录), no(允许密码登录) |
--check-interval |
无 | 1 |
检测间隔时间,单位小时,默认1,最低1,最大48 |
--ssh-port |
-p |
22 |
SSH服务端口,默认22,建议使用非标准端口增强安全性 |
--debug |
-debug |
false |
显示详细的依赖检测过程 |
--clean-keys |
-sk |
false |
清理并重新生成SSH私钥(默认不清理旧私钥) |
--skip-dependencies |
-sd |
false |
跳过依赖检查,直接执行升级流程(默认不跳过) |
systemd服务管理
注册为systemd服务
sudo ssh-auto-upgrade --service
⚠️ 重要说明:升级期间服务管理
升级期间需要停止的服务:
- CLS服务 - 主要的SSH守护进程服务
- xc-ssh.service - 属于SSH守护的辅助服务
服务停止流程:
- 升级前自动检查并停止上述两个服务
- 升级完成后自动重新启动服务
- 如果服务不存在,会输出提示信息并继续执行
冲突服务处理建议:
- 如果有其他与SSH相关的服务存在冲突,建议:
- 修改服务名称 - 避免与SSH守护服务冲突
- 使用不同端口 - 配置不同的监听端口
- 不要使用本工具 - 如果存在无法解决的冲突
安全特性:
- 自动检查服务存在性,避免操作不存在的服务
- 服务停止失败不会影响主要升级流程
- 提供详细的日志输出,便于问题排查
安装使用效果
[root@ecs ~]# pip3 install ssh-auto-upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple/
Looking in indexes: https://pypi.tuna.tsinghua.edu.cn/simple/
Collecting ssh-auto-upgrade
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/76/5a/0058bc6b79ff1f35dfcdc00de7d2d61636de768da4225c3601c1db20c4e8/ssh_auto_upgrade-1.0.21-py3-none-any.whl (61 kB)
Collecting requests>=2.25.0
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl (62 kB)
Requirement already satisfied: systemd-python>=234 in /usr/lib64/python3.7/site-packages (from ssh-auto-upgrade) (234)
Collecting beautifulsoup4>=4.9.0
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/94/fe/3aed5d0be4d404d12d36ab97e2f1791424d9ca39c2f754a6285d59a3b01d/beautifulsoup4-4.14.2-py3-none-any.whl (106 kB)
Collecting dbus-python>=1.2.0
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/ff/24/63118050c7dd7be04b1ccd60eab53fef00abe844442e1b6dec92dae505d6/dbus-python-1.4.0.tar.gz (232 kB)
Installing build dependencies ... done
Getting requirements to build wheel ... done
Preparing wheel metadata ... done
Collecting plpm-liumou-stable>=1.0.1
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/58/a3/b83da7d015409f17ad35396122f360ea640de77bceced807efa93b196195/plpm_liumou_stable-1.0.2-py3-none-any.whl (29 kB)
Requirement already satisfied: urllib3<3,>=1.21.1 in /usr/lib/python3.7/site-packages (from requests>=2.25.0->ssh-auto-upgrade) (1.24.3)
Collecting certifi>=2017.4.17
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl (163 kB)
|████████████████████████████████| 163 kB 796 kB/s
Collecting charset-normalizer<4,>=2
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl (53 kB)
|████████████████████████████████| 53 kB 2.6 MB/s
Requirement already satisfied: idna<4,>=2.5 in /usr/lib/python3.7/site-packages (from requests>=2.25.0->ssh-auto-upgrade) (2.8)
Collecting soupsieve>1.2
Downloading https://pypi.tuna.tsinghua.edu.cn/packages/49/37/673d6490efc51ec46d198c75903d99de59baffdd47aea3d071b80a9e4e89/soupsieve-2.4.1-py3-none-any.whl (36 kB)
Collecting typing-extensions>=4.0.0
Using cached https://pypi.tuna.tsinghua.edu.cn/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl (33 kB)
Building wheels for collected packages: dbus-python
Building wheel for dbus-python (PEP 517) ... done
Created wheel for dbus-python: filename=dbus_python-1.4.0-cp37-cp37m-linux_aarch64.whl size=127550 sha256=a2282c2e21565b51d59f983b9d70bf7ea795c6f8c9b6f35086b8e1a15c392549
Stored in directory: /root/.cache/pip/wheels/3a/74/b0/4bad641f2016f4157e1fb2d2f217945f745c493ee4f2ef5277
Successfully built dbus-python
ERROR: docker-compose 1.22.0 has requirement requests!=2.11.0,!=2.12.2,!=2.18.0,<2.22,>=2.6.1, but you'll have requests 2.31.0 which is incompatible.
Installing collected packages: certifi, charset-normalizer, requests, soupsieve, typing-extensions, beautifulsoup4, dbus-python, plpm-liumou-stable, ssh-auto-upgrade
Attempting uninstall: requests
Found existing installation: requests 2.21.0
Uninstalling requests-2.21.0:
Successfully uninstalled requests-2.21.0
Successfully installed beautifulsoup4-4.14.2 certifi-2025.10.5 charset-normalizer-3.4.4 dbus-python-1.4.0 plpm-liumou-stable-1.0.2 requests-2.31.0 soupsieve-2.4.1 ssh-auto-upgrade-1.0.21 typing-extensions-4.7.1
[root@ecs ~]# ssh-auto-upgrade -h
usage: ssh-auto-upgrade [-h] [--mirror MIRROR] [--install-dir INSTALL_DIR]
[--download-dir DOWNLOAD_DIR] [--log-dir LOG_DIR]
[--force] [--service] [--upgrade-time UPGRADE_TIME]
[--root-login {auto,yes,no}] [--check-interval [1-48]]
OpenSSH自动升级守护进程工具-V1.0.21
optional arguments:
-h, --help show this help message and exit
--mirror MIRROR, -m MIRROR
OpenSSH镜像源URL
--install-dir INSTALL_DIR, -i INSTALL_DIR
OpenSSH安装目录
--download-dir DOWNLOAD_DIR, -d DOWNLOAD_DIR
下载目录
--log-dir LOG_DIR, -l LOG_DIR
日志目录
--force, -f 强制升级,即使版本相同也执行安装
--service, -s 注册为systemd服务
--upgrade-time UPGRADE_TIME, -t UPGRADE_TIME
升级时间段,格式为 HH:MM:SS-HH:MM:SS,默认00:00:00-08:00:00
--root-login {auto,yes,no}
升级后root登录配置: auto(智能检测当前配置,默认), yes(启用), no(禁用)
--check-interval [1-48]
检测间隔时间,单位小时,默认1,最低1,最大48
[root@ecs ~]# ssh-auto-upgrade -s
2025-10-30 09:41:39 - ssh_auto_upgrade - INFO - [main.py:84] main() - 检测到当前root登录配置: 禁用
2025-10-30 09:41:39 - ssh_auto_upgrade - INFO - [main.py:85] main() - 默认设置为: --root-login no
2025-10-30 09:41:39 - ssh_auto_upgrade - INFO - [main.py:86] main() - 可通过 --root-login yes/no 参数强制设置
2025-10-30 09:41:39 - ssh_auto_upgrade - INFO - [main.py:89] main() - 检查镜像地址可用性
2025-10-30 09:41:39 - ssh_auto_upgrade.mirror_checker - INFO - [mirror_checker.py:47] check_mirror_availability() - 开始检测镜像地址可用性: https://mirrors.aliyun.com/openssh/portable/
2025-10-30 09:41:39 - ssh_auto_upgrade.mirror_checker - INFO - [mirror_checker.py:67] check_mirror_availability() - ✓ 镜像地址可用: https://mirrors.aliyun.com/openssh/portable/
2025-10-30 09:41:39 - ssh_auto_upgrade - INFO - [main.py:100] main() - 镜像地址检测通过
2025-10-30 09:41:39 - ssh_auto_upgrade - INFO - [main.py:103] main() - 检查编译依赖
2025-10-30 09:41:39 - ssh_auto_upgrade.dependencies - INFO - [dependencies.py:44] _init_modules() - plpm模块已成功加载
2025-10-30 09:41:39 - ssh_auto_upgrade.dependencies - INFO - [dependencies.py:280] ensure_dependencies() - 检查编译依赖...
2025-10-30 09:41:39 - ssh_auto_upgrade.dependencies - INFO - [dependencies.py:281] ensure_dependencies() - 检测到系统: kylin
2025-10-30 09:41:39 - ssh_auto_upgrade.dependencies - INFO - [dependencies.py:282] ensure_dependencies() - 检测到包管理器: yum
2025-10-30 09:41:40 - ssh_auto_upgrade.dependencies - INFO - [dependencies.py:288] ensure_dependencies() - ✓ 所有编译依赖已安装
2025-10-30 09:41:40 - ssh_auto_upgrade - INFO - [main.py:116] main() - 编译依赖检查通过
2025-10-30 09:41:40 - ssh_auto_upgrade - INFO - [service_registrar.py:27] register_service() - 正在注册systemd服务...
2025-10-30 09:41:40 - ssh_auto_upgrade - INFO - [service_registrar.py:33] register_service() - 开始服务检测流程...
=== 开始服务检测流程 ===
⚠️ 检测到xc-ssh服务存在
请确认该服务是否为SSH守护服务:
- 如果是SSH守护服务,可以继续注册,升级期间会停止该服务,升级完成后启动
- 如果不是SSH守护服务,建议重命名该服务以避免冲突
xc-ssh服务是否为SSH守护服务?(y/n): y
确认xc-ssh为SSH守护服务,继续注册...
✓ 确认以下服务为SSH守护服务: xc-ssh
这些服务将在升级期间被停止,升级完成后重新启动。
=== 服务检测流程完成 ===
2025-10-30 09:41:44 - ssh_auto_upgrade - INFO - [service_registrar.py:86] register_service() - 成功: systemd服务注册成功,服务已启动并设置为开机自启
服务已注册,可以使用以下命令管理:
systemctl start ssh-auto-upgrade # 启动服务
systemctl stop ssh-auto-upgrade # 停止服务
systemctl status ssh-auto-upgrade # 查看服务状态
systemctl enable ssh-auto-upgrade # 启用开机自启
systemctl disable ssh-auto-upgrade # 禁用开机自启
服务启动命令 (ExecStart):
/usr/local/bin/ssh-auto-upgrade --mirror https://mirrors.aliyun.com/openssh/portable/ --install-dir /usr/local/openssh --download-dir /tmp/ssh-upgrade --log-dir /var/log/ssh-auto-upgrade --upgrade-time 00:00:00-08:00:00 --root-login no
[root@ecs ~]#
时间段升级功能
工具支持设置特定的升级时间段,只有在指定时间段内才会执行版本检测和升级操作,其他时间自动跳过检测。
时间段格式
- 格式:
HH:MM:SS-HH:MM:SS - 示例:
00:00:00-08:00:00(凌晨0点到早上8点) - 跨天支持:
22:00:00-06:00:00(晚上10点到次日早上6点)
使用场景
- 业务低峰期升级 - 在凌晨时段自动升级,避免影响正常业务
- 网络空闲时段 - 在网络使用率低的时段进行下载和安装
- 运维窗口期 - 在预定的维护窗口内执行升级操作
示例日志
升级时间段设置为: 00:00:00 - 08:00:00
当前时间 09:33:09 不在升级时间段内,跳过检测...
等待1小时后再次检查...
Root登录配置功能
工具支持在OpenSSH升级后自动配置root登录权限,可以根据当前系统配置智能处理或强制设置。
智能检测机制
- 配置文件不存在 - 默认启用root登录
- 配置未设置 - 默认启用root登录
- 配置被注释 - 默认启用root登录
- 配置已设置 - 遵循当前配置值
命令行参数
# 智能检测root登录配置(默认)
ssh-auto-upgrade --root-login auto
# 强制启用root登录
ssh-auto-upgrade --root-login yes
# 强制禁用root登录
ssh-auto-upgrade --root-login no
# 强制升级并启用root登录
ssh-auto-upgrade --force --root-login yes
# 注册服务时设置root登录配置
ssh-auto-upgrade --service --root-login yes
ssh-auto-upgrade --service --root-login no
# 结合时间段和root登录配置
ssh-auto-upgrade --upgrade-time 00:00:00-08:00:00 --root-login yes
配置处理流程
- 升级前检测 - 检查当前SSH配置中的root登录设置
- 升级执行 - 完成OpenSSH版本升级
- 配置应用 - 根据参数设置root登录权限
- 服务重启 - 重启SSH服务使配置生效
安全特性
- 自动备份 - 修改配置前自动备份原文件
- 权限保护 - 确保配置文件权限正确
- 错误恢复 - 配置失败时自动恢复备份
示例日志
检查当前root登录配置...
当前root登录状态: 启用 (PermitRootLogin yes)
OpenSSH升级成功! 新版本: 9.6p1
SSH服务重启成功
已启用root登录: root登录已启用
SSH服务重启成功(应用root登录配置): SSH服务重启成功
升级后连接验证功能
从版本1.0.24开始,SSH自动升级工具在升级完成后会自动进行连接验证,确保新版本的OpenSSH服务正常工作。验证通过创建临时账号、测试SSH连接、重启服务(如需要)和清理临时账号来完成。
🔄 工作流程
- 升级完成检测 - 当OpenSSH升级成功并重启服务后
- 临时账号创建 - 自动生成随机用户名和密码,创建系统用户
- SSH连接测试 - 使用临时账号测试SSH连接功能
- 服务重启重试 - 如果首次连接失败,自动重启SSH服务并重试
- 临时账号清理 - 验证完成后自动删除临时账号和相关文件
🔐 安全性特性
临时账号安全
- 用户名格式:
ssh_test_+ 时间戳 - 密码: 16位随机字符(字母+数字)
- 自动管理: 自动创建和删除,不会留下安全隐患
权限控制
- 标准权限: 临时用户使用标准的
/bin/bashshell - 权限管理: 具有标准的系统用户权限
- 自动清理: 验证完成后立即删除,不会留下系统账号
网络安全
- 本地测试: 只测试本地localhost连接
- 网络隔离: 不暴露临时账号到外部网络
- 信息清理: 使用后立即清理所有敏感信息
📋 使用示例
# 守护进程模式,升级后自动验证
sudo ssh-auto-upgrade
# 单次运行,升级后自动验证
sudo ssh-auto-upgrade --force
# 服务注册模式,升级后自动验证
sudo ssh-auto-upgrade --service
📊 验证日志输出
验证成功的日志信息:
INFO - 开始验证SSH升级后的连接功能
INFO - 开始SSH升级验证流程
INFO - 生成临时账号: ssh_test_1640995200
INFO - 临时用户创建成功: ssh_test_1640995200
INFO - 等待SSH服务准备就绪...
INFO - SSH服务端口已开放
INFO - 尝试连接SSH服务...
INFO - SSH连接验证成功
INFO - SSH升级验证成功,服务连接正常
INFO - 临时账号验证完成,已清理临时账号
验证失败的日志信息:
WARNING - 首次连接失败,尝试重启SSH服务
INFO - SSH服务已重启
WARNING - 重启后连接验证仍然失败
WARNING - SSH升级验证失败,可能存在连接问题
WARNING - SSH连接验证过程中发生错误: 具体的错误信息
🔧 依赖要求
# 安装额外的Python包
pip install paramiko>=2.7.0
# 需要root权限运行(用于创建和删除系统用户)
sudo ssh-auto-upgrade
🛠️ 手动测试
可以单独测试验证功能:
# 使用测试脚本
sudo python test_temp_validator.py
# 直接调用验证函数
sudo python -c "
import sys, os
sys.path.insert(0, 'src')
from ssh_auto_upgrade.temp_account_validator import validate_ssh_connection_after_upgrade
result = validate_ssh_connection_after_upgrade()
print(f'验证结果: {\"成功\" if result else \"失败\"}')
"
🐛 故障排除
常见错误及解决方案
-
权限错误
错误: 需要root权限运行临时账号验证 解决: 使用sudo运行程序 -
依赖缺失
ModuleNotFoundError: No module named 'paramiko' 解决: pip install paramiko>=2.7.0 -
SSH服务未运行
SSH连接验证失败: 连接超时 解决: 检查sshd服务状态 systemctl status sshd -
用户创建失败
创建临时用户失败: User already exists 解决: 系统可能存在残留用户,手动清理或重试
📈 配置选项
目前验证功能使用固定配置,如需自定义可在temp_account_validator.py中修改:
- 最大等待时间:
max_wait=30秒 - SSH连接超时:
timeout=10秒 - 重启后等待时间:
time.sleep(5)秒
🔗 与其他功能的关系
与现有升级流程的关系
- 可选步骤: 验证是升级流程的可选步骤,不影响升级本身
- 非阻塞: 验证失败不会阻止升级完成,只会在日志中记录警告
- 故障诊断: 验证结果可以帮助诊断升级后的问题
与配置管理的关系
- 独立验证: 验证使用临时账号,不依赖当前的SSH配置
- 时机安排: 验证在配置应用和服务重启后执行,确保配置生效
- 结果反映: 验证结果反映升级和配置的最终效果
与守护进程的关系
- 自动触发: 验证在每次升级成功后执行一次
- 非阻塞: 验证超时不会影响守护进程的正常运行
- 日志记录: 验证结果记录在日志中,便于后续分析
循环日志系统
工具采用智能循环日志系统,有效防止日志文件无限增长导致磁盘空间耗尽。
核心特性
- 自动轮转 - 日志文件达到指定大小后自动创建新文件
- 智能命名 - 支持
.1,.2等扩展名格式的日志轮转 - 路径追踪 - 自动追踪当前活动日志文件路径
- 兼容模式 - 同时支持循环日志和普通文件日志
日志文件结构
/var/log/ssh-auto-upgrade/
├── ssh_upgrade.log # 当前活动日志文件
├── ssh_upgrade.1.log # 上一个日志文件
├── ssh_upgrade.2.log # 更早的日志文件
└── ...
配置参数
# 在代码中配置循环日志
logger = setup_logger(
log_dir="/var/log/ssh-auto-upgrade",
max_bytes=10*1024*1024, # 10MB per file
backup_count=5 # Keep 5 backup files
)
使用示例
# 查看当前活动日志文件
tail -f /var/log/ssh-auto-upgrade/ssh_upgrade.log
# 查看所有日志文件
ls -la /var/log/ssh-auto-upgrade/
# 查看上一个日志文件的内容
cat /var/log/ssh-auto-upgrade/ssh_upgrade.1.log
作为Python模块使用
from ssh_auto_upgrade import VersionDetector, Downloader, Installer
# 检测最新版本
detector = VersionDetector()
version_info = detector.get_latest_version()
print(f"最新版本: {version_info['version']}")
# 下载安装文件
downloader = Downloader()
script_path = downloader.download_install_script()
# 执行安装
installer = Installer(script_path, version_info['download_url'])
if installer.install_openssh():
print("安装成功!")
✅ 测试验证
服务管理功能测试
项目已通过全面的服务管理功能测试,验证了ServiceManager类的完整功能:
🧪 测试环境
- 测试系统: Ubuntu Linux
- 测试服务: vsftpd (FTP服务器)
- 测试工具: 自定义测试脚本
test_service_manager.py
📊 测试结果
所有5项核心测试全部通过:
- ✅ 基本功能测试 - ServiceManager实例化、systemd检测、可执行文件检查
- ✅ 服务状态检查 - 使用D-Bus API准确检测服务状态
- ✅ 服务控制功能 - 启动、停止、启用、禁用服务操作
- ✅ 服务文件创建 - 正确生成systemd服务文件
- ✅ 完整服务管理流程 - 完整的服务生命周期管理
🔧 关键修复
在测试过程中发现并修复了以下问题:
- D-Bus接口调用优化 - 将
bus.get_interface()改为使用预初始化的接口对象 - API调用一致性 - 确保所有服务控制方法使用一致的D-Bus API调用方式
- 错误处理完善 - 增强了异常处理和状态验证机制
🎯 功能验证
通过vsftpd服务的实际测试,验证了ServiceManager类的以下能力:
- 服务检测 - 准确识别服务存在状态
- 服务控制 - 可靠的启动、停止、启用、禁用操作
- 服务文件管理 - 正确的systemd服务文件生成
- 错误处理 - 完善的异常处理和状态反馈
- 权限管理 - 正确的root权限检查
系统兼容性
工具已在以下环境中验证:
- ✅ Ubuntu 20.04+ (systemd环境)
- ✅ Debian 10+ (systemd环境)
- ✅ CentOS 7+ (systemd环境)
依赖验证
所有Python依赖包已更新并验证:
- ✅
requests>=2.25.0- HTTP请求处理 - ✅
beautifulsoup4>=4.9.0- HTML解析 - ✅
systemd-python>=234- systemd集成 - ✅
dbus-python>=1.2.0- D-Bus API集成(新增)
项目现已具备完整、可靠的服务管理能力,可以安全地用于生产环境。
📋 系统要求
Python环境
- Python: 3.6 或更高版本
- pip: 包管理工具
系统包(自动检测和安装)
- 编译工具: gcc, make, autoconf, automake
- 开发库: zlib-devel, openssl-devel, pam-devel
- 系统工具: wget, tar, systemd
Python包依赖
- requests >= 2.25.0 - HTTP请求处理
- beautifulsoup4 >= 4.9.0 - HTML解析
🔧 模块详解
核心模块
1. 版本检测模块 (version_detector.py)
- 从OpenSSH官方镜像源解析最新版本信息
- 检测当前系统安装的OpenSSH版本
- 支持自定义镜像源URL
2. 下载器模块 (downloader.py)
- 支持断点续传和进度显示
- 文件完整性验证和错误重试
- 可配置的下载目录和超时设置
3. 安装器模块 (installer.py)
- 完整的编译安装流程控制
- 错误处理和回滚机制
- 与服务管理和文件管理模块协同工作
4. 服务管理模块 (service_manager.py)
- systemd服务注册和管理
- 服务状态监控和故障恢复
- 权限验证和安全控制
- D-Bus API集成 - 使用dbus-python进行systemd服务管理
- 服务生命周期管理 - 完整的服务创建、启用、启动、停止、禁用、移除流程
- 错误处理机制 - 完善的异常处理和状态反馈
✅ 服务管理功能测试验证
通过全面的功能测试验证,ServiceManager类已确认具备以下能力:
- ✅ 基本功能测试 - 实例化、systemd检测、可执行文件检查
- ✅ 服务状态检查 - 使用D-Bus API准确检测服务状态
- ✅ 服务控制功能 - 启动、停止、启用、禁用服务
- ✅ 服务文件创建 - 正确生成systemd服务文件
- ✅ 完整服务管理流程 - 完整的服务生命周期管理
🔧 关键修复
- 修复了D-Bus接口调用问题,将
bus.get_interface()改为使用预初始化的接口对象 - 确保所有服务控制方法使用一致的D-Bus API调用方式
- 完善了错误处理和状态验证机制
辅助模块
依赖管理模块 (dependencies.py)
- 自动检测系统包管理器(apt/yum/dnf等)
- 智能安装缺失的编译依赖
- 支持多种Linux发行版
参数验证模块 (argument_validator.py)
- 时间格式验证和解析
- 路径有效性检查
- 参数组合逻辑验证
- 错误提示和修复建议
系统检测模块
- 镜像源检查 (
mirror_checker.py) - 验证镜像源可用性和响应速度 - 服务检测 (
service_detector.py) - 检测SSH相关服务状态 - systemd检查 (
systemd_checker.py) - 验证systemd环境和支持 - 时间检查 (
time_checker.py) - 时间段验证和格式检查 - 安装器服务检测 (
installer_service_detector.py) - 安装器服务状态检测
配置管理模块
- SSH配置管理 (
ssh_config_manager.py) - SSH配置文件解析和修改 - 遗留清理 (
legacy_cleaner.py) - 清理旧版本文件和配置
日志记录模块 (logger.py)
- 结构化日志记录
- 文件和控制台双重输出
- 循环日志系统 - 支持日志文件轮转和大小限制
- 智能路径管理 - 自动管理当前活动日志文件路径
- 时间戳和日志级别过滤
循环日志系统特性
- 自动轮转 - 日志文件达到指定大小后自动创建新文件
- 文件限制 - 支持设置最大日志文件数量和总大小限制
- 路径追踪 - 智能追踪当前活动日志文件路径
- 兼容性 - 同时支持循环日志和普通文件日志
🐛 故障排除
常见问题
1. 权限不足
# 确保以root权限运行服务注册
sudo ssh-auto-upgrade --service
2. 网络连接问题
# 检查网络连接
ping mirrors.aliyun.com
3. 依赖安装失败
# 手动安装编译依赖(Ubuntu/Debian)
sudo apt update
sudo apt install build-essential zlib1g-dev libssl-dev libpam0g-dev
# CentOS/RHEL
sudo yum install gcc make zlib-devel openssl-devel pam-devel
日志查看
# 查看服务日志
sudo journalctl -u ssh-auto-upgrade
# 实时监控日志
sudo journalctl -u ssh-auto-upgrade -f
# 查看特定时间段的日志
sudo journalctl -u ssh-auto-upgrade --since "2024-01-01" --until "2024-01-02"
🤝 贡献指南
我们欢迎各种形式的贡献!请参考以下步骤:
开发环境设置
-
Fork项目
git clone https://gitee.com/liumou_site/ssh-automatic-upgrade.git cd ssh-automatic-upgrade
-
创建特性分支
git checkout -b feature/你的特性名称
-
提交更改
git commit -m "描述你的特性"
-
推送到分支
git push origin feature/你的特性名称
-
创建Pull Request
代码规范
- 遵循PEP 8 Python代码规范
- 添加适当的文档字符串(docstring)
- 包含单元测试(如果适用)
- 更新相关文档
📄 许可证
本项目采用 MIT许可证。您可以自由使用、修改和分发本软件。
🔗 相关链接
- 项目主页: https://gitee.com/liumou_site/ssh-automatic-upgrade
- 问题反馈: 请在Gitee Issues中提交
- 作者主页: https://liumou.site
- QQ群: 点击链接加入群聊【坐公交也用券】:
🙏 致谢
感谢所有为这个项目做出贡献的开发者!特别感谢:
- OpenSSH开发团队提供优秀的SSH实现
- 各Linux发行版维护者
- 开源社区的支持和反馈
注意: 使用本工具前请确保您了解相关风险,建议在生产环境使用前进行充分测试。工具作者不对因使用本工具导致的任何问题负责。
Metadata
Release files for ssh-auto-upgrade 1.1.5
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| ssh_auto_upgrade-1.1.5.tar.gz | 89.6 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| ssh_auto_upgrade-1.1.5-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 168.2 kB
Release files / ssh_auto_upgrade-1.1.5.tar.gz
| Download URL | ssh_auto_upgrade-1.1.5.tar.gz |
|---|---|
| Size | 89.6 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
df4e425917042cf62fe6f570370f2a8b2be88212ee79343e65e3bdcfbbd6f12a
|
|
BLAKE2b-256 checksum How to use checksums |
d103938630e46ad91bfee593ba896523045a0404bb34a73d2bd9f89c23a0be9c
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.2
|
Release files / ssh_auto_upgrade-1.1.5-py3-none-any.whl
| Download URL | ssh_auto_upgrade-1.1.5-py3-none-any.whl |
|---|---|
| Size | 78.6 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
5e14321ee926d1130fdebca4aa3f152b17ef8980b1fd678c4efbb1c90a3aa034
|
|
BLAKE2b-256 checksum How to use checksums |
c4b1915db16a9d177476444ffbc8b80de145b84a620cfd8471f6609181c4753a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.2.0 CPython/3.11.2
|