You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
解析 ~/.ssh 真实路径(USERPROFILE vs HOME);文件权限;OpenSSH 安装指引常量
边界
不含业务规则
依赖
仅标准库 + os/user
2.2.7 V2 预留:internal/backup(或合入 config)
项
内容
职责
加密打包 config + 选定私钥;恢复与 Host 冲突合并(同名不同 IP → 自动重命名)
边界
不托管云存储;路径由用户 flag 指定
依赖
用户口令 + AEAD(如 argon2 + secretbox,实现阶段选型)
2.3 模块依赖规则
禁止:config → wizard(下层不依赖编排层)
允许:cmd → 任意 domain;domain → platform only
测试:config、keys 必须可无 CLI 框架单测
3. 数据流设计
3.1 核心业务流程
流程 A:密码连接一站式配置(MVP P0)
sequenceDiagram
actor U as 用户
participant W as wizard
participant K as keys
participant C as config
participant S as sshclient
participant F as ~/.ssh 文件
participant V as VPS
U->>W: fuckssh add(密码模式)
W->>S: 检测 ssh 是否存在
alt 无 ssh
S-->>U: 分平台安装指引(仍可继续部署)
end
W->>C: 备份 config
W->>K: 生成 Ed25519 密钥对
K->>F: 写入私钥/公钥
W->>C: 追加 Host 块
C->>F: 写入 config
W->>S: SSH 密码登录
S->>V: append authorized_keys
alt 部署失败
S-->>U: 错误 + 回滚说明(config 备份路径)
end
W-->>U: 提示 ssh <别名>
Loading
流程 B:密钥连接(MVP P0)
sequenceDiagram
actor U as 用户
participant W as wizard
participant C as config
participant F as ~/.ssh
U->>W: 提供已有私钥路径
W->>C: 备份 config
W->>C: 写入 Host + IdentityFile
C->>F: 更新 config
W-->>U: 提示 ssh <别名>(需本机已能密钥登录)
Loading
流程 C:列出 / 搜索(MVP P0)
flowchart LR
A[fuckssh list/search] --> B[config.Parse]
B --> C{解析成功?}
C -->|否| D[stderr: 行号+片段]
C -->|是| E[[]HostEntry]
E --> F{search?}
F -->|是| G[子串匹配 alias/hostname/IP]
F -->|否| H[tabwriter 输出]
G --> H
Loading
3.2 状态管理
状态类型
策略
运行时状态
无持久化;单次命令结束即释放
用户配置数据
仅存于 ~/.ssh/config 与密钥文件
向导中的密码
仅驻内存,不写磁盘、不进日志
并发
不锁文件;文档约定「勿并行运行两个 add」;V2 可考虑写前 flock
3.3 异步处理
不适用。 全流程同步;无队列、无后台 worker。
4. CLI 命令契约(替代 HTTP API)
本产品无 REST API;对外契约为 Cobra 子命令 + flags。
4.1 命令规范
约定
说明
命名
动词:add、list、search;V2:backup、restore
全局 flag
--config <path> 覆盖默认 ssh config 路径(高级用户)
输出
正常结果 → stdout;错误与指引 → stderr;退出码非 0 表示失败
帮助
每子命令 --help;root 列出子命令树
4.2 核心命令
命令
说明
关键参数 / 交互
fuckssh add
新 VPS 向导
交互:模式、IP、用户、密码(密码模式)、端口、别名、算法
fuckssh list
列出所有 Host
可选 --json(V2+ 可考虑)
fuckssh search <query>
模糊搜索
query 匹配 alias / HostName / IP
fuckssh backup
V2 加密导出
--out、口令
fuckssh restore
V2 解密合并
--from、口令
4.3 「认证与授权」
不适用(无多用户服务)。 安全边界为本机 OS 用户权限:谁可读写 ~/.ssh 谁就能使用本工具。
flowchart LR
Dev[开发者 push] --> GHA[GitHub Actions]
GHA --> Test[go test ./...]
Test --> GR[GoReleaser tag]
GR --> Artifacts[win/mac/linux 二进制]
Artifacts --> User[用户下载或 go install]
Loading
平台
产物
说明
Windows
fuckssh.exe
需文档强调 OpenSSH 客户端可选功能
macOS
fuckssh amd64/arm64
通常已有 ssh
Linux
fuckssh
依赖 openssh-client
6.3 网络拓扑
不适用。 仅发布时 GitHub HTTPS;运行时除向导连 VPS 外无服务间调用。
6.4 CI/CD 流水线
# 概念阶段 — 实现脚手架时落地on: [push, pull_request]jobs:
test:
runs-on: ubuntu-lateststeps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
- run: go test ./...
- run: golangci-lint run # 可选
发布:tag v* 触发 GoReleaser,附 changelog。
6.5 成本估算
项
月成本
托管
$0
CI
$0(GitHub 免费档)
域名
$0(可选)
7. 安全设计
7.1 认证鉴权
本机:依赖 OS 用户对 ~/.ssh 的访问控制。
远端(密码模式):一次性密码认证,仅用于首次部署公钥;禁止将密码写入 config、日志或备份包。
7.2 数据保护
项
措施
私钥文件
Unix 0600;Windows 限制继承 ACL(platform 封装)
密码
内存持有,函数返回前清零引用(best effort)
config 修改
先备份再写;失败时文档说明手动恢复
V2 备份
用户口令 + AEAD;manifest 不含明文密码;README 安全提示
7.3 安全策略
威胁
缓解
命令注入
不使用 shell 拼接;ssh 若调用用 exec.Command + 参数列表
路径遍历
用户提供的私钥路径需 filepath.Clean 并限制在预期目录(可选警告)
备份包泄露(V2)
强 KDF + 随机 salt;文档提醒同步盘风险
日志泄密
默认不打印密码、私钥内容;--verbose 仍屏蔽敏感字段
8. 可观测性
8.1 日志规范
级别
用途
输出
默认
list/search 表格;add 成功时 stdout 仅 ssh <别名> 一行
stdout
进度与摘要
向导步骤、add 操作清单与安全提示
stderr
元信息
list/search 的 config 路径与主机计数
stderr
错误
用户可读文案(随语言设置中/英)+ 技术细节(无密钥)
stderr
--verbose
步骤级进度(解析块数、连接阶段)
stderr
不引入 ELK / Prometheus;可选未来 FUCKSSH_DEBUG=1 环境变量。
8.2 监控指标
不适用。 质量靠单元测试 + 发布前 Win/macOS 手工冒烟。
8.3 告警策略
不适用。 用户反馈走 GitHub Issues。
8.4 链路追踪
不适用。
9. 异常与容错
9.1 错误处理策略
领域错误包装 fmt.Errorf("...: %w", err),CLI 层统一 main 处理退出码。