Skip to content

feat(P2-2): SSH 运维模块(终端 POST 轮询/批量执行/片段/日志跟踪) - #551

Merged
fastapiadmin merged 1 commit into
masterfrom
dev
Oct 22, 2026
Merged

fastapiadmin merged 1 commit into
masterfrom
dev

Conversation

@fastapiadmin

Copy link
Copy Markdown
Owner

P2-2 SSH 运维模块

按需求不移植本机终端 / 本机文件 / run_host_command(多租户 Web 下等于 RCE 面)。

后端(app/modules/ops/ssh)

  • 主机管理:密码/私钥/口令 Fernet 加密,出参只回 has_password / has_private_key;
    认证方式校验(password 必须有密码、key 必须有私钥);连接只用显式凭据(禁用 agent/默认密钥),
    私钥支持 Ed25519 / RSA / ECDSA
  • 终端会话:进程内会话表 + 读取线程 + 队列;POST 轮询(不引入第二条 WebSocket);
    会话归属校验(跨用户 403)、单用户 3 个 / 全局 50 个上限、空闲 30 分钟回收、resize/resync/close
  • 日志跟踪:在交互 shell 内执行 tail -n N -F -- <quoted path>,复用轮询会话
  • 批量执行:多主机同命令(并发 5、单机超时可调、输出截断、单机失败不影响其它主机),
    执行写审计日志
  • 19 条路由,全部带 AuthPermission + OperationLogRoute

前端

  • /ops/ssh 页面:主机管理 / 命令片段 / 批量执行 / 终端 四个 tab;终端为轮询式(base64 传输、自动滚动、可关闭)

验证

  • 后端:pytest 219 passed(新增 19 项)、ruff 通过、basedpyright 0 errors
  • 前端:vue-tsc 通过、eslint 无错、prettier 通过、vitest 41 passed

说明:终端会话是进程内状态;多 worker 部署时需粘性会话或改为共享存储(当前部署为单容器多 worker,
若启用多 worker 需注意)。入口用隐藏静态路由 /ops/ssh,如需侧栏可在「菜单管理」新增。

按 FastHub 移植清单落地 P2-2;**不含本机终端/本机文件/run_host_command**(多租户下等于 RCE,按需求排除)。

后端(新模块 app/modules/ops/ssh)
- model:ops_ssh_host(密码/私钥/口令 Fernet 加密,出参只回 has_password/has_private_key)、
  ops_ssh_snippet(命令片段)
- 主机:CRUD + 唯一名 + 认证方式校验(password 必须有密码、key 必须有私钥)+ 按凭据测试连接
  (look_for_keys=False/allow_agent=False,只用显式凭据;私钥支持 Ed25519/RSA/ECDSA)
- 终端会话(terminal.py):进程内会话表 + 读取线程 + 队列;**POST 轮询**(不依赖 WebSocket);
  归属校验(跨用户 403)、单用户 3 个/全局 50 个上限、空闲 30 分钟回收、resize/resync/close
- 日志跟踪:在交互 shell 内执行 ,复用轮询会话
- 批量执行:多主机同命令(并发 5、单机超时 15s 可调、stdout/stderr 截断、单机失败不影响其它主机);
  执行记录写审计日志(用户/主机/命令截断 200 字)
- 路由 /ops/ssh/*(19 条),全部走 AuthPermission + OperationLogRoute

前端
- api/module_ops/ssh.ts + views/module_ops/ssh/index.vue:主机管理/命令片段/批量执行/终端四个 tab;
  终端为轮询式(700ms 拉取,base64 传输,自动滚动,可关闭);日志跟踪入口
- router:/ops/ssh 懒加载静态路由(隐藏菜单,直接访问)

测试:tests/test_ops_ssh_terminal.py(7 项)+ tests/test_ops_ssh_service.py(12 项)
验证:后端 pytest **219 passed**、ruff 通过、basedpyright 0 errors;
前端 vue-tsc 通过、eslint 无错、prettier 通过、vitest **41 passed**。
@fastapiadmin
fastapiadmin merged commit f9263b2 into master Oct 22, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant