跳到主要内容

添加密钥

在控制台中添加

  1. 在控制台中打开 SSH 密钥页面,地址是 /keys
  2. 选择添加 SSH 密钥
  3. 输入名称,最多 64 个字符 —— work laptopdesktop,只要能让你分清这是哪台机器就行。这个名称只是给你自己看的标签,不会发送到实例。
  4. .pub 文件的全部内容粘贴到公钥中。
  5. 选择添加密钥

该密钥会出现在列表中,并显示它的 SHA256 指纹以及添加时间。

粘贴完整的一整行,从 ssh-ed25519 一直到末尾的注释。Superheat 会对照接受的类型列表检查类型,并解码密钥内容,所以粘贴不完整、粘贴了私钥或使用了不受支持的算法,都会返回 INVALID_SSH_KEY。添加一个你已经有的密钥会返回 DUPLICATE_SSH_KEY,它按指纹匹配,而不是按名称。

密钥属于用户,不属于组织

SSH 密钥属于你的用户账户。它会跟着你进入你所在的每一个组织,切换组织不会改变列表中的内容。

情况会发生什么
团队成员打开他们的 SSH 密钥页面他们看到的是自己的密钥,永远看不到你的
你切换到另一个组织你的密钥仍然在那里,没有变化
有人加入你的组织他们添加自己的密钥;不会共享任何东西
有人被移出组织他们的密钥留在他们自己的账户上

不存在组织级的密钥,一个实例部署时只带一个密钥:你在部署表单上选择的那一个。

密钥在启动时就固化了

部署页面有一个 SSH 密钥选择器。它默认是不使用密钥(仅网页终端),所以你必须主动选择自己的密钥。

你选择的密钥会在实例创建过程中写入该实例的授权密钥列表。这是唯一会发生这件事的时刻。

操作对实例的影响
选好密钥后部署该密钥被安装,SSH 可用,适用于 sshjupytervm 启动模式
不选密钥就部署在该实例的整个生命周期内都不会安装任何密钥
之后再往账户里添加密钥已有的实例不受影响
停止实例后再启动它保留启动时带的那个密钥;不会重新读取任何内容
从 SSH 密钥页面删除某个密钥已经在运行的实例仍然保留它;新的部署无法再选择它

只有当模板的启动模式引导 Superheat 入口点时,密钥才会进入容器 —— 也就是 sshjupytervmargs 模板运行的是镜像自带的入口点,它不会启动 sshd,所以在那里选择密钥也没有任何东西可供你连接。参见启动模式

实例上的 SSH 只认密钥。没有密码可以退而求其次。

在部署之前添加密钥,而不是之后

没有任何 API 调用、控制台操作或重启能给一个已经存在的实例装上密钥。如果你在没有密钥的情况下部署,重新部署是拿到 shell 的唯一办法。

如果你忘了

实例仍然是你的,也仍然在计费 —— 你失去的是访问权限,不是机器或磁盘。

  1. 现在就在 SSH 密钥页面添加你的密钥,这样下一次部署就能用上它。
  2. 如果模板会启动 JupyterLab,从实例页面打开它,用它的终端把你需要的东西从磁盘上拷出来。
  3. 销毁该实例,然后选中密钥重新部署。

销毁会永久删除磁盘。动手之前先读停止与销毁

停止再启动没有用。密钥是在实例创建时决定的,不是在它启动时。

通过 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 密钥的那个用户。参见身份验证

密钥添加好之后,继续去部署,然后通过 SSH 连接