提交 d140c5e1 authored 作者: 陈泽健's avatar 陈泽健

feat(common): 添加Shell脚本上传功能并新增服务自检优化文档

- 实现Upload-ShellScript函数用于上传Shell脚本到远程服务器
- 创建服务自检检测优化需求文档_PRD_服务自检检测优化_需求文档.md
- 创建服务自检检测优化计划执行文档_PLAN_计划执行文档_服务自检检测优化.md
- 需求文档涵盖安全合规检测、MySQL/Redis深度检测、系统资源增强等功能
- 计划文档详细描述双版本同步策略和实施时间线
- 上传功能支持common.sh基础函数库和指定检测脚本的远程传输
上级 271ab62c
...@@ -295,6 +295,78 @@ rm -f /tmp/.upload_${fileName}.b64 ...@@ -295,6 +295,78 @@ rm -f /tmp/.upload_${fileName}.b64
} }
} }
# ==============================================================================
# 上传Shell脚本到远程服务器
# ==============================================================================
function Upload-ShellScript {
<#
.SYNOPSIS
上传Shell脚本到远程服务器
.DESCRIPTION
将本地 Shell 脚本(common.sh + 指定脚本)上传到远程服务器的临时目录。
用于 Shell 模式检测和文件权限修复。
.PARAMETER Server
服务器连接信息哈希表,包含 IP、User、Pass、Port
.PARAMETER ScriptName
要上传的脚本文件名(如 resource_check.sh)
.PARAMETER RemotePath
远程目标目录,默认为 /tmp/health_check
.EXAMPLE
Upload-ShellScript -Server $server -ScriptName "resource_check.sh"
.OUTPUTS
System.Boolean
上传成功返回 true,失败返回 false
#>
param(
[Parameter(Mandatory=$true)] [hashtable]$Server,
[Parameter(Mandatory=$true)] [string]$ScriptName,
[Parameter(Mandatory=$false)] [string]$RemotePath = "/tmp/health_check"
)
# 创建远程临时目录
$cmd = "mkdir -p $RemotePath 2>/dev/null"
$mkdirResult = Invoke-SSHCommand -HostName $Server.IP -User $Server.User -Pass $Server.Pass -Port $Server.Port -Command $cmd
if ($mkdirResult.ExitCode -ne 0) {
Write-Log -Level "ERROR" -Message "[SHELL] 创建远程目录失败: $RemotePath"
return $false
}
# 检查本地脚本是否存在
$localCommonPath = Join-Path $global:SCRIPT_DIR "lib\shell\common.sh"
$localScriptPath = Join-Path $global:SCRIPT_DIR "lib\shell\$ScriptName"
if (-not (Test-Path $localCommonPath)) {
Write-Log -Level "ERROR" -Message "[SHELL] 本地脚本不存在: $localCommonPath"
return $false
}
if (-not (Test-Path $localScriptPath)) {
Write-Log -Level "ERROR" -Message "[SHELL] 本地脚本不存在: $localScriptPath"
return $false
}
# 上传基础函数库
$commonUploadResult = Copy-File-To-Remote -LocalPath $localCommonPath -Server $Server -RemoteDir $RemotePath
if (-not $commonUploadResult) {
Write-Log -Level "ERROR" -Message "[SHELL] 上传基础函数库失败: common.sh"
return $false
}
# 上传检测脚本
$scriptUploadResult = Copy-File-To-Remote -LocalPath $localScriptPath -Server $Server -RemoteDir $RemotePath
if (-not $scriptUploadResult) {
Write-Log -Level "ERROR" -Message "[SHELL] 上传脚本失败: $ScriptName"
return $false
}
return $true
}
# ============================================================================== # ==============================================================================
# 上传修复脚本函数 # 上传修复脚本函数
# ============================================================================== # ==============================================================================
...@@ -459,5 +531,6 @@ Export-ModuleMember -Function @( ...@@ -459,5 +531,6 @@ Export-ModuleMember -Function @(
'Write-Log', 'Write-Log',
'Invoke-SSHCommand', 'Invoke-SSHCommand',
'Copy-File-To-Remote', 'Copy-File-To-Remote',
'Upload-ShellScript',
'Upload_the_repair_script' 'Upload_the_repair_script'
) )
# _PRD_服务自检检测优化_需求文档
> 版本:V1.0
> 更新日期:2026-06-06
> 适用范围:服务自检脚本 - 检测功能优化与新增
> 来源:基于《服务器监测需求规整版需求文档》183项检测项完成率分析(当前73%,134项已完成,49项未实现)
---
## 1. 背景与目标
### 1.1 背景
当前服务自检脚本已完成模块化拆分(15个模块),覆盖平台检测、服务检测、中间件连通性检测等基础能力。但根据《未实现功能清单》和实际运维场景,存在以下不足:
- **安全检测空白**:无弱密码检测、无安全合规扫描,现场部署存在安全隐患
- **中间件深度不足**:仅检测连通性,缺少健康指标(Redis 缓存命中率、MySQL 慢查询、EMQX 消息丢弃等)
- **磁盘检测盲区**:仅检测空间占用率,缺少 inode 使用率和只读挂载检测
- **JVM 黑盒**:Java 服务仅检测进程存活,无 JVM 堆内存、GC、线程等健康指标
- **新平台备份缺失**:DataBakup 仅支持传统平台,新统一平台无备份能力
- **缺乏趋势对比**:每次检测结果独立,无法与上次结果对比发现新增/修复的异常
### 1.2 目标
- 补齐安全合规检测能力,覆盖弱密码和安全基线扫描
- 增强中间件深度检测,提供有价值的健康指标而非仅连通性
- 补齐系统资源检测盲区(inode、只读挂载、网络状态)
- 新增 JVM 健康检测,为 Java 服务排障提供依据
- 补全新平台数据备份能力
- 新增 JVM 健康检测,为 Java 服务排障提供依据
---
## 2. 功能需求
### 2.1 安全合规检测
**目标:** 发现中间件和系统中的安全风险,包括弱密码配置和系统安全隐患
#### 2.1.1 弱密码检测
| 检测项 | 说明 |
|--------|------|
| MySQL Root 访问范围 | 检查 root 用户是否允许从任意主机(%)连接 |
| MySQL 空密码用户 | 检查是否存在无密码的数据库用户 |
| Redis 无密码/弱密码 | 检查 Redis 配置文件中 `requirepass` 是否为空或使用常见弱密码 |
| EMQX 默认密码 | 检查 EMQX Dashboard 是否使用默认用户名密码 |
| Linux 空密码账户 | 检查系统中是否存在无密码登录的用户账户 |
#### 2.1.2 安全基线扫描
| 检测项 | 说明 |
|--------|------|
| 可疑 SUID 文件 | 扫描系统中所有 SUID 文件,与白名单对比发现异常 |
| 异常 crontab 条目 | 扫描用户和系统定时任务,发现可疑条目 |
| SSH 暴力破解痕迹 | 分析安全日志中失败登录次数,识别暴力破解行为 |
| 异常开放端口 | 扫描所有监听端口,与预期端口白名单对比 |
---
### 2.2 MySQL 深度检测
**目标:** 在现有连通性检测基础上,新增 MySQL 引擎状态和性能指标检测
| 检测项 | 说明 |
|--------|------|
| InnoDB 缓冲池命中率 | 评估缓冲池效率,命中率过低表示需扩容 |
| 慢查询状态 | 检查慢查询日志是否开启,统计慢查询数量 |
| 连接使用率 | 当前连接数与最大连接数的比值,过高需关注 |
| 活跃连接详情 | 当前正在执行的 SQL 连接列表 |
| QPS/TPS | 每秒查询数和每秒事务数,作为性能基线 |
| 主从复制状态 | 检查 IO/SQL 线程状态和复制延迟 |
| TOP20 大表 | 按数据大小排序的前20张表,识别需优化的表 |
---
### 2.3 Redis 深度检测
**目标:** 在现有连通性检测基础上,新增 Redis 持久化和性能指标检测
| 检测项 | 说明 |
|--------|------|
| RDB 持久化状态 | 检查最后一次 RDB 快照是否成功及时间 |
| AOF 持久化状态 | 检查 AOF 是否开启及最后一次写入状态 |
| 内存碎片率 | 评估 Redis 内存碎片情况,过高需重启整理 |
| 缓存命中率 | keyspace_hits 与 keyspace_misses 的比率 |
| 键空间统计 | 各数据库的键数量、过期键和驱逐键数量 |
| 主从复制状态 | 复制角色、从库连接数、复制偏移量 |
---
### 2.4 EMQX 深度检测
**目标:** 通过 EMQX Dashboard API 获取详细运行指标
| 检测项 | 说明 |
|--------|------|
| 客户端连接数统计 | 当前连接数和连接数趋势 |
| 消息流入/流出速率 | 消息吞吐量指标 |
| 消息丢弃数 | 被丢弃的消息数量,大于0需排查 |
| 主题和订阅数量 | 当前主题数和订阅数 |
| 集群状态 | 如启用集群,检查所有节点是否在线 |
| 活跃告警 | 当前未处理的告警列表 |
---
### 2.5 系统资源增强检测
**目标:** 补齐现有 ServerResourceAnalysis 模块的检测盲区
#### 2.5.1 磁盘检测增强
| 检测项 | 说明 |
|--------|------|
| inode 使用率 | 检测各挂载点的 inode 使用率,inode 耗尽比空间耗尽更隐蔽 |
| 只读挂载检测 | 检测是否有文件系统被意外挂载为只读 |
#### 2.5.2 网络连通性增强
| 检测项 | 说明 |
|--------|------|
| 关键端口连通性 | 检测 MySQL(3306)/Redis(6379)/EMQX(1883) 等关键端口是否可达 |
| 网关可达性 | 检查默认网关是否可 ping 通 |
| TCP 连接状态分布 | 统计各 TCP 状态(ESTABLISHED/CLOSE_WAIT/TIME_WAIT 等)数量 |
| DNS 解析延迟 | 测量 DNS 解析响应时间 |
#### 2.5.3 进程与负载增强
| 检测项 | 说明 |
|--------|------|
| 僵尸进程检测 | 检查系统中是否存在僵尸进程(Z 状态) |
| 内存/CPU TOP5 进程 | 列出资源消耗最大的前5个进程 |
| 系统运行时间 | 记录系统上次重启时间 |
---
### 2.6 新平台数据备份
**目标:** 补全新统一平台的数据备份能力(当前仅支持传统平台)
| 备份对象 | 新平台路径 | 说明 |
|----------|-----------|------|
| Java 服务 | `/data/services/api/` | 所有 Java 后端服务 |
| 前端应用 | `/data/services/web/` | 所有前端应用 |
| 中间件配置 | `/data/middleware/` | nginx/emqx/redis/mysql/nacos 配置 |
| 启动脚本 | `/data/services/scripts/` | 启动脚本 |
| 第三方应用 | `/data/third_party/` | paperless/wifi-local |
| MySQL 数据 | 通过 `docker exec umysql mysqldump` | 导出所有用户数据库 |
备份流程与传统平台一致:复制 → 导出 → 打包 → 下载 → 清理。
---
### 2.7 JVM 健康检测
**目标:** 为 Java 服务提供 JVM 运行时健康指标,辅助问题排查
| 检测项 | 说明 |
|--------|------|
| 堆内存使用率 | 当前堆内存使用量与最大堆内存的比率 |
| GC 统计 | Young GC 和 Full GC 次数及耗时 |
| 线程数 | 当前 JVM 活跃线程数 |
| 死锁检测 | 检查是否存在线程死锁 |
| JVM 版本 | 记录 JDK 版本信息 |
**说明:** 优先通过 JDK 自带工具(`jcmd`)获取指标,无 `jcmd` 时通过 `/proc` 文件系统降级获取基础信息。
---
## 3. 实施优先级
### 第一期
| 优先级 | 需求 | 对应章节 |
|--------|------|----------|
| P0 | 弱密码检测 + 安全基线扫描 | 2.1 |
| P0 | MySQL 深度检测 | 2.2 |
| P1 | Redis 深度检测 | 2.3 |
| P1 | inode + 只读挂载检测 | 2.5 |
| P1 | 新平台数据备份 | 2.6 |
### 第二期
| 优先级 | 需求 | 对应章节 |
|--------|------|----------|
| P2 | EMQX 深度检测 | 2.4 |
| P2 | JVM 健康检测 | 2.7 |
| P2 | 网络连通性 + 进程检测增强 | 2.5 |
---
## 4. 验收标准
### 4.1 安全合规检测
- [ ] 能正确检测 MySQL 中 root@% 和空密码用户
- [ ] 能正确检测 Redis 无密码或弱密码配置
- [ ] 能正确检测 EMQX 默认 Dashboard 密码
- [ ] 能正确检测 Linux 系统空密码账户
- [ ] 能扫描 SUID 文件并与白名单对比
- [ ] 能扫描异常 crontab 条目
- [ ] 能检测 SSH 暴力破解痕迹
- [ ] 能扫描开放端口并与白名单对比
### 4.2 中间件深度检测
- [ ] MySQL 缓冲池命中率计算正确,阈值判断合理
- [ ] MySQL 慢查询检测包含开关状态和数量统计
- [ ] MySQL 主从复制状态和延迟检测正确
- [ ] Redis 持久化状态(RDB/AOF)检测正确
- [ ] Redis 缓存命中率计算正确
- [ ] EMQX 通过 API 获取连接数、消息丢弃数等指标
### 4.3 系统资源增强
- [ ] inode 使用率检测正确
- [ ] 只读挂载检测正确
- [ ] TCP 连接状态分布统计正确
- [ ] 僵尸进程检测正确
### 4.4 新平台备份
- [ ] 新平台所有关键目录完整备份
- [ ] MySQL 数据正确导出
- [ ] 压缩包完整下载到本地
### 4.5 JVM 健康检测
- [ ] 堆内存使用率获取正确
- [ ] GC 次数统计正确
- [ ] 死锁检测正确
- [ ] 无 jcmd 时能降级获取基础信息
---
## 5. 需求规范
- 代码规范: `Docs/PRD/01规范文档/_PRD_规范文档_代码规范.md`
- 问题总结: `Docs/PRD/01规范文档/_PRD_问题总结_记录文档.md`
- 方法总结: `Docs/PRD/01规范文档/_PRD_方法总结_记录文档.md`
- 文档规范: `Docs/PRD/01规范文档/_PRD_规范文档_文档规范.md`
- 测试规范: `Docs/PRD/01规范文档/_PRD_规范文档_测试规范.md`
---
## 6. 版本历史
| 版本 | 日期 | 变更内容 | 作者 |
|------|------|----------|------|
| V1.0 | 2026-06-06 | 初始版本 | Claude |
---
*文档结束*
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论