SSH
从 Mac 经 SSH 访问来宾 — 哪个地址真正可用、ssh 配置里添加的一行、密钥、账户与主机密钥信任。
SSH 在每台机器上默认关闭,需手动开启。开启即打开进入来宾的登录路径,不应被意外获得。
1vm ssh enable dev
1vm ssh config --install # 向 ~/.ssh/config 添加 Include 行
ssh dev # 普通 ssh 现在可解析机器名
应用中也有 Configure → SSH 面板,控件相同;两个前端互不包装。
哪个地址真正可用
这是容易踩坑的部分,取决于引擎。1vm list 中的来宾地址并非总能直连。
| 引擎 | 网络 | Mac → 来宾 |
|---|---|---|
| Virtualization.framework | NAT 或 host-only | 直连来宾 192.168.64.x 租约 |
| Virtualization.framework | 桥接 | 直连其 LAN 地址 |
| 1VM 引擎 | NAT 或 host-only | 仅经 loopback 端口转发 |
| 1VM 引擎 | 桥接 | 直连其 LAN 地址 |
在 1VM 引擎上,来宾位于用户态 NAT 栈后的固定 10.0.2.15,Mac 没有该子网接口。ssh 10.0.2.15 永远不通。可用的是转发:
ssh -p 2222 onevm@127.0.0.1
开启 SSH 会创建该转发,即时生效,无需重启。转发绑定 127.0.0.1,开启 SSH 不会把来宾暴露到网络。
添加到 ssh 配置的一行
1vm ssh config --install 在 ~/.ssh/config 顶部添加一个哨兵块:
# >>> 1VM managed >>> do not edit this block
Include ~/Library/Application Support/OneVM/VMs/.ssh/config
# <<< 1VM managed <<<
其余生成到库自己的 .ssh/ 目录,你的文件只多一行,1VM 管理其余。ONEVM_HOME 移动整个结构,项目本地库可自带 SSH 配置。
规则如下,因编辑非自有文件:
- 文件顶部,因
ssh_config先到先得 —Include放在已有Host *之后会静默失效。 - 幂等。 运行十次仍只有一个块。
- 原子写入并备份。 写入前原文件复制到带时间戳的
config.1vm-backup-…。 - 可逆。
--uninstall只移除哨兵块。--print只显示不写。 - 拒绝而非重排。 若配置在块位置之上已为所有主机设选项,1VM 会告知并拒绝,不重排你的文件。
- 不遮蔽真实主机。 若机器名已在 ssh 配置中解析到其他主机,只生成
<name>.1vm别名。
生成的块如下 — 端口与地址按上述可达性规则,从不使用原始来宾 IP:
Host dev dev.1vm
HostName 127.0.0.1
Port 22417
User dev
IdentityFile ".../dev.vm/agent-key"
IdentitiesOnly yes
AddressFamily inet
StrictHostKeyChecking yes
ConnectTimeout 5
密钥
每台机器在 bundle 内 agent-key 处有独立 Ed25519 密钥,模式 0600。因在文件夹内,1vm clone 会一并复制,克隆体可用同一身份连接。
可用自己的密钥。1VM 只存路径,仅将匹配的 .pub 复制到来宾 — 不读取、复制或存储私钥。
1vm ssh keys dev # 显示机器密钥
1vm ssh keys dev --print-public # 公钥行
1vm ssh keys dev --regenerate # 新密钥对
1vm set dev ssh.identityFile ~/.ssh/id_ed25519
账户
1vm set dev ssh.users … 管理来宾中存在的账户。名称按来宾族校验 — Linux 与 macOS 为 [a-z_][a-z0-9_-]{0,31},Windows 最多 20 字符并拒绝保留标点 — 管理员分别映射为 wheel/sudo、Administrators 或 admin。
onevm 保留。1vm exec、1vm task run 与 MCP 服务器以此登录,重命名或删除会破坏它们。面板显示为锁定的 agent 账户行而非隐藏 — 存在却不可见的登录是欺骗。
root 与 Administrator 也保留,root 登录关闭。
主机密钥信任
多数工具首次连接信任任何应答。1VM 更好:有带外通道,经 guest-agent 读取来宾公钥主机密钥(不经过待认证网络)并固定。
| 状态 | 所见 | ssh 行为 |
|---|---|---|
| 未学习 | “首次连接将信任任何应答” | StrictHostKeyChecking accept-new |
| 已学习 | SHA256:… 指纹与日期 | StrictHostKeyChecking yes |
| 不匹配 | 警告旧密钥固定日期,及 Relearn 按钮 | yes — 连接正确失败 |
1vm ssh trust dev # 固定当前主机密钥
1vm ssh trust dev --relearn # 合法变更后重新固定
1vm reset、恢复 sshd 存在前快照、重装后不匹配属正常,也与攻击表象相同 — 故始终是按钮操作,从不静默覆盖。
克隆。 身份密钥故意复制到克隆;主机密钥固定不复制,因两机同一主机密钥是真实问题。用 1vm clone dev test --rekey-ssh 在首次启动时重新生成来宾主机密钥。
安全默认值
- 仅密钥认证。密码与 keyboard-interactive 关闭,root 登录关闭,无 agent 或 X11 转发。
- 转发绑定 loopback,开启 SSH 不会把来宾暴露到 LAN。绑定公网地址可能但会明文警告含义。
- 私钥与账户创建参数仅走私有通道,不入日志。
回滚模式清除 SSH 账户
回滚模式 在关机时丢弃自启动以来的一切写入 — 包括 provision 进来宾的账户与密钥。非 bug,1VM 每启重新 provision 而非信任标记文件。来宾主机密钥也会每次变化。
来宾到 Mac
反向 — 从来宾 SSH 到 Mac — 在 1VM 引擎上经 10.0.2.2,且仅限已注册服务的端口。1VM 不会为你启用 macOS 远程登录;仍由你在系统设置中决定。
当前状态
SSH 已实现于应用、CLI 与两引擎,并有单元测试覆盖。两点坦诚说明:
- 实时来宾 soak 测试仍是未完成的验收门槛。
- 出厂 Omarchy 镜像早于将
openssh加入包列表,故出厂 Omarchy 来宾在镜像重建前无sshd。其他 Linux 来宾不受影响。