Docs · 参考

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.frameworkNAT 或 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 来宾不受影响。