添加密钥
在控制台中添加
- 在控制台中打开 SSH 密钥页面,地址是
/keys。 - 选择添加 SSH 密钥。
- 输入名称,最多 64 个字符 ——
work laptop、desktop,只要能让你分清这是哪台机器就行。这个名称只是给你自己看的标签,不会发送到实例。 - 把
.pub文件的全部内容粘贴到公钥中。 - 选择添加密钥。
该密钥会出现在列表中,并显示它的 SHA256 指纹以及添加时间。
粘贴完整的一整行,从 ssh-ed25519 一直到末尾的注释。Superheat 会对照接受的类型列表检查类型,并解码密钥内容,所以粘贴不完整、粘贴了私钥或使用了不受支持的算法,都会返回 INVALID_SSH_KEY。添加一个你已经有的密钥会返回 DUPLICATE_SSH_KEY,它按指纹匹配,而不是按名称。
密钥属于用户,不属于组织
SSH 密钥属于你的用户账户。它会跟着你进入你所在的每一个组织,切换组织不会改变列表中的内容。
| 情况 | 会发生什么 |
|---|---|
| 团队成员打开他们的 SSH 密钥页面 | 他们看到的是自己的密钥,永远看不到你的 |
| 你切换到另一个组织 | 你的密钥仍然在那里,没有变化 |
| 有人加入你的组织 | 他们添加自己的密钥;不会共享任何东西 |
| 有人被移出组织 | 他们的密钥留在他们自己的账户上 |
不存在组织级的密钥,一个实例部署时只带一个密钥:你在部署表单上选择的那一个。
密钥在启动时就固化了
部署页面有一个 SSH 密钥选择器。它默认是不使用密钥(仅网页终端),所以你必须主动选择自己的密钥。
你选择的密钥会在实例创建过程中写入该实例的授权密钥列表。这是唯一会发生这件事的时刻。
| 操作 | 对实例的影响 |
|---|---|
| 选好密钥后部署 | 该密钥被安装,SSH 可用,适用于 ssh、jupyter 和 vm 启动模式 |
| 不选密钥就部署 | 在该实例的整个生命周期内都不会安装任何密钥 |
| 之后再往账户里添加密钥 | 已有的实例不受影响 |
| 停止实例后再启动 | 它保留启动时带的那个密钥;不会重新读取任何内容 |
| 从 SSH 密钥页面删除某个密钥 | 已经在运行的实例仍然保留它;新的部署无法再选择它 |
只有当模板的启动模式引导 Superheat 入口点时,密钥才会进入容器 —— 也就是 ssh、jupyter 和 vm。args 模板运行的是镜像自带的入口点,它不会启动 sshd,所以在那里选择密钥也没有任何东西可供你连接。参见启动模式。
实例上的 SSH 只认密钥。没有密码可以退而求其次。
没有任何 API 调用、控制台操作或重启能给一个已经存在的实例装上密钥。如果你在没有密钥的情况下部署,重新部署是拿到 shell 的唯一办法。
如果你忘了
实例仍然是你的,也仍然在计费 —— 你失去的是访问权限,不是机器或磁盘。
- 现在就在 SSH 密钥页面添加你的密钥,这样下一次部署就能用上它。
- 如果模板会启动 JupyterLab,从实例页面打开它,用它的终端把你需要的东西从磁盘上拷出来。
- 销毁该实例,然后选中密钥重新部署。
销毁会永久删除磁盘。动手之前先读停止与销毁。
停止再启动没有用。密钥是在实例创建时决定的,不是在它启动时。
通过 API
| 方法 | 路径 | 作用 |
|---|---|---|
GET | /v1/ssh-keys | 列出你的密钥及其指纹 |
POST | /v1/ssh-keys | 添加密钥 |
DELETE | /v1/ssh-keys/{key_id} | 删除密钥 |
{
"name": "work laptop",
"public_key": "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ8mQ2sT9vXbN1kR4pLwZ0aYcE7hJ6uD3fGgH5iKmNoP you@example.com"
}
返回的 id 就是你创建实例时作为 ssh_key_id 传入的值。
这些是账户级接口,只接受会话令牌 —— 组织 API 密钥(shk_…)在这三个接口上都会被拒绝。部署时 API 密钥仍然可以传入 ssh_key_id;但它指定的密钥必须属于创建该 API 密钥的那个用户。参见身份验证。