# 制作自己的私人安装包

公开包包含工具与教程，不包含发布者或使用者的凭据。下面操作只在制作者自己的可信电脑上执行，输出只能给自己信任的安装者/机器。它不修改源目录、源 Key 或源客户端配置。

制作与导入私人配置脚本需要 **Python 3.11 或更新版本**，只使用标准库；SSHMCP 原生程序运行本身不需要 Python。先执行 `python3 --version`（Windows 通常为 `py -3 --version`）。先在公开包根目录校验 SHA256SUMS，再执行脚本。

## A. 有中心：预置中心地址与接入 Key

前置：自己的中心已正常运行，本机已完成一次真实接入，拥有原生安装器保存的私密 `connection.json`。默认 Linux 为 `~/.sshmcp/connection.json`，Windows 为 `%USERPROFILE%\.sshmcp\connection.json`。不需要复制中心的 SSH 私钥或数据库。

Linux：

```bash
python3 tools/make-private-bundle.py --mode center \
  --profile "$HOME/.sshmcp/connection.json" \
  --output "$HOME/.sshmcp-private-packages/sshmcp-center-private.zip"
```

Windows PowerShell：

```powershell
py -3 tools/make-private-bundle.py --mode center `
  --profile "$env:USERPROFILE\.sshmcp\connection.json" `
  --output "$env:USERPROFILE\.sshmcp-private-packages\sshmcp-center-private.zip"
```

脚本校验公开包，读取指定 profile，生成同时含 Linux/Windows 程序和 AI 入口的私人包，只额外保存 private/ENDPOINT 与 private/API_KEY。它不会下载服务器目录或把节点 SSH 私钥打进包。

新机 AI 先询问安装方式和客户端；安装者选择接入中心后，原生安装器通过 `--key-file` 消费包内 Key，不需要让安装者再次输入 Key。安装期间仍需要中心可达。中心 Key 代表整个目录所有者权限；该包适用于自己的可信机器，不是多用户权限隔离方案。

## B. 无中心：携带自己的服务器目录

默认只复制明确指定的 SSHMCP TOML 目录，不扫描用户目录，不自动复制 SSH 私钥：

```bash
python3 tools/make-private-bundle.py --mode standalone \
  --catalog /absolute/private/ssh-config.toml \
  --output "$HOME/.sshmcp-private-packages/sshmcp-standalone-private.zip"
```

Windows 使用 `py -3`，并把路径换成实际 Windows 路径。目录里的 password/passphrase 等字段如果存在，会随这个私人包保存；“不自动复制私钥文件”不表示输出不含其他密码。因此所有 standalone 私人包都按含凭据处理。

如明确需要把目录引用的私钥一起迁移，可加 `--include-ssh-keys`：

```bash
python3 tools/make-private-bundle.py --mode standalone \
  --catalog /absolute/private/ssh-config.toml --include-ssh-keys \
  --output "$HOME/.sshmcp-private-packages/sshmcp-standalone-with-keys.zip"
```

只读取此目录中 key_path/keypath/ssh_key 引用的文件，不遍历 ~/.ssh。引用路径须为绝对路径或 ~ 路径；文件按内容指纹去重，目录中改为可移植占位路径。源 TOML 不改。SSH agent 身份不能导出；相对密钥路径、冲突别名或不支持的目录格式会拒绝，先修正自己的明确输入后重新制作。

新机 AI 先询问方式，选择独立本机后安装程序，再运行包内 import-private-config.py 导入到新私密目录，替换占位密钥路径并合并所选客户端配置。工具拒绝覆盖既有目标。未包含私钥时必须检查新机自己的密钥/agent；仅复制目录不等于 SSH 已能登录。

## 保存、传送与验收

输出目录新建时设置为当前用户私有：Linux 0700，ZIP 0600；Windows 限当前用户、SYSTEM 和管理员。已有输出目录权限过宽会拒绝，不会擅自改其他目录 ACL。每次使用新的 ZIP 文件名，脚本拒绝覆盖旧包。普通 ZIP 没有加密，文件权限不是传输加密；通过你信任的私密通道传送，不上传公开下载站点或源码仓库。

脚本仅输出成功状态、模式、路径和 SHA-256，不能把 Key/密码放进命令行值。生成后先在隔离目录核对成员和校验和，再在受信任机器完成实际安装与一个选定目标的只读验证。故障时保留安装器备份，不清理源 Key。重做私人包时从原公开包重新开始，避免把旧私人包再次嵌套进去。

有中心时，用户撤销/轮换接入 Key 后应重新制作私人包，并更新自己的客户端 profile；旧运行实例的目录/连接可能仍驻留内存，需要正常退出相应实例才能完全释放。无中心时，停止客户端并删除明确选择的本机目录/私钥才会移除持久化副本；不要把“删除压缩包”当成清除已安装凭据。
