前言¶
在 DeepSeek Harness(DSH)里跑智能体时,常见需求是查 systemd 服务、看磁盘、扫 Docker 容器、跟日志。若把 shell 权限直接交给模型,风险高;若完全不让碰主机,又很难做日常运维。社区插件 dsh-vps-ops(维护者 ozanstn1-stack)走另一条路:给智能体一套显式、可配置的工具,默认只读,破坏性操作必须落在白名单上并经过宿主确认。下面介绍它的定位、能力与安装配置方式。
这是什么¶
dsh-vps-ops 是面向 DeepSeek Harness 的 VPS 运维插件,分类为 admin-security。一句话概括:Read-first 的服务器运维工具——systemd、Docker、磁盘、日志、备份与静默时段调度检查;主机上的 unit、容器、备份命令和时间窗口全部来自插件配置,代码里不硬编码你的环境。
当前版本 0.1.0(MIT 许可证),要求 DSH >= 0.2.1-rc.4,Node ^22.19.0 || >=24.0.0。目录页:skillhub.cn/plugins/ozanstn1-stack/dsh-vps-ops;源码:github.com/ozanstn1-stack/dsh-vps-ops。社区目录为独立站点,与 DeepSeek / 幻方无官方从属关系。
核心功能¶
插件向 DSH 注册一组工具,读写分离清晰。
只读工具¶
| 工具 | 作用 |
|---|---|
service_status |
对配置的一个或全部 systemd unit 查 systemctl 状态、子状态、重启次数、PID、启动时间、主机 uptime,以及最近错误相关 journal 行。 |
disk_usage |
df -h /、inode 使用,以及 / 下体积最大的五个顶层目录。 |
docker_status |
列出运行中容器,或对白名单内某一容器做 docker inspect(状态、健康、重启等)。 |
log_tail |
对白名单 unit 做 journalctl tail,或在配置的日志目录内 tail 绝对路径文件;最多 200 行。 |
quiet_hours_status |
纯计算:列出配置的静默窗口,并判断当前时刻是否落在窗口内;不启停任何服务。 |
破坏性工具¶
| 工具 | 作用 |
|---|---|
service_action |
对白名单内单个 unit 执行 systemctl start|stop|restart,需通过审批。 |
backup_run |
执行配置里的一条备份命令(argv 数组),需通过审批。 |
Read-only by default。 只读模式下破坏性工具会直接拒绝;非只读时也只接受白名单目标,并在运行前向宿主请求批准。
安全模型(设计要点)¶
官方 README 用几条原则约束执行面,适合在安装前通读一遍:
- 不把模型输入拼进 shell:命令以「可执行文件 + argv 数组」执行;名称在校验后才进入 argv,避免例如 unit 名叫
--help之类的选项注入。 - 仅白名单:
service_action、指定容器的docker_status、指定 unit 的log_tail、backup_run只认配置里的名称。 - 日志文件不出目录:
log_tail读文件时会解析符号链接,拒绝落在logs.dirs之外的路径。 - 有界执行:每条命令有墙钟超时和 stdout/stderr 字节上限;输出失控会终止子进程。
- 最小环境、不转发凭据。
- 审批失败即关闭:审批缺失或抛错则不执行;每次获批的破坏性操作写一行 JSON 到审计日志(默认
<DSH_HOME>/logs/vps-ops-audit.log)。
依赖 systemctl / journalctl 与 docker;二进制缺失时以工具输出告知,而不是让插件崩溃。
安装与启用¶
先做插件安装,再重启 DSH 进程使插件加载。
dsh plugin --profile web add dsh-vps-ops
systemctl restart dsh-web # or restart your DSH process
安装命令以 README 为准;不要凭仓库名自行拼接 dsh plugin add github:...。
然后在所用 profile 的 cordis.patch.yml 里为 vps-ops 写入白名单与策略。没有 config 块时插件仍会加载,但只会报告「尚未配置任何项」。
典型配置示例¶
下面片段来自官方 README,展示 services、containers、backups、quietHours、logs 与 safety 如何一起工作。按你的主机改名即可。
- id: vps-ops
config:
services:
- label: DSH Web
unit: dsh-web
- label: OpenBot
unit: openbot
containers:
- label: OpenViking
name: openviking
backups:
- id: openviking-daily
label: OpenViking backup
command: ['/usr/local/bin/openviking-backup.sh']
timeoutMs: 120000
quietHours:
timeZone: UTC
windows:
- 'Mon-Fri 01:00-04:00'
- 'Mon-Fri 06:00-10:00'
logs:
dirs: ['/var/log']
safety:
readOnly: false
requireApproval: true
timeoutMs: 15000
maxOutputBytes: 65536
常用配置项含义如下(默认值以 README 为准):
| 键 | 默认 | 含义 |
|---|---|---|
services |
[] |
{ label, unit } 的 systemd 白名单。 |
containers |
[] |
{ label, name } 的 Docker 容器白名单。 |
backups |
[] |
{ id, label, command, timeoutMs };command 优先 argv 数组,也可为 shell 字符串。 |
quietHours.timeZone |
UTC |
评估窗口用的 IANA 时区。 |
quietHours.windows |
[] |
"<days> HH:MM-HH:MM";日范围可跨周(如 Fri-Mon),结束早于开始则跨午夜。 |
logs.dirs |
["/var/log"] |
log_tail 允许读取文件的目录。 |
safety.readOnly |
true |
为 true 时 service_action、backup_run 拒绝执行。 |
safety.requireApproval |
true |
为 true 时破坏性工具先问宿主。 |
safety.timeoutMs |
15000 |
默认命令超时(毫秒)。 |
safety.maxOutputBytes |
65536 |
单次调用输出上限。 |
经过上面的步骤,智能体在对话里即可调用只读工具排查问题;需要重启服务或跑备份时,会走审批与审计路径。
适用场景与注意¶
适合谁: 已在 VPS 上跑 DSH、希望智能体协助看服务/磁盘/Docker/日志,并在严格白名单与审批下偶尔执行 restart 或备份脚本的运维或开发者。
务必注意:
- 插件以 当前 DSH 进程的 Unix 权限 运行,能做什么取决于该用户能否
systemctl、docker、读日志、执行你配置的备份命令。安装前请阅读源码与 MIT 许可证,确认工具行为符合你的安全基线。 - 生产环境可先用
safety.readOnly: true只做观测,再按需放开破坏性工具并保持requireApproval: true。 quiet_hours_status只帮助判断「现在是否在静默窗口」,不会代替你现有的变更流程或自动停服。
结尾¶
dsh-vps-ops 把 VPS 日常运维收成一组可配置、默认只读、破坏性操作可审计的 DSH 工具,与「一切皆插件」的 DSH 生态一致。需要细节时查 GitHub README 与 SkillHub 目录页。