跳到主要内容

通过 SSH 连接

复制连接命令

实例中打开该实例,停留在连接标签页。命令已经替你渲染好,主机、端口和用户都已填好:

ssh -p 40123 root@sh-us-tx-01.ssh.superheat.dev

用旁边的复制按钮,不要手动重敲各个部分。连接信息只有在实例进入 running 之后才会出现;在那之前标签页会告诉你还没准备好。

除非渲染出来的命令另有说明,用户就是 root。认证使用你在部署时附加的 SSH 密钥。

为什么端口不是 22

在容器内部,sshd 监听 22。该端口随后被发布到主机上的某个端口,取自这台主机可用的端口范围,而你连接的正是这个主机端口。号码在启动时分配,每个实例都不一样,和 22 没有任何关系。

有两个后果值得记住:

ssh root@sh-us-tx-01.ssh.superheat.dev 不带 -p会失败,或者连到某个不是你的实例的东西上
停止再启动之后的主机和端口会重新签发,因此可能不是你之前用的那一对

每次启动后都从连接标签页重新复制命令,不要依赖 shell 历史记录里的那一条。

首次连接

容器第一次启动时会生成一个全新的主机密钥,所以新实例总会提示:

The authenticity of host '[sh-us-tx-01.ssh.superheat.dev]:40123 ([203.0.113.14]:40123)' can't be established.
ED25519 key fingerprint is SHA256:0Xk2r1uJ3q…
Are you sure you want to continue connecting (yes/no/[fingerprint])?

回答 yes。指纹会针对那个主机和端口记录到 ~/.ssh/known_hosts 中。

由于实例来来去去,主机和端口的组合会被回收再利用,你早晚会在一个用过的主机和端口上连到一个新实例,此时 OpenSSH 会以 REMOTE HOST IDENTIFICATION HAS CHANGED 拒绝连接。删掉过期的条目再连一次:

ssh-keygen -R "[sh-us-tx-01.ssh.superheat.dev]:40123"

当你的客户端提供了错误的密钥

密码认证是关闭的;authorized_keys 里只有部署时附加的那把密钥。如果你的 SSH agent 里存了好几把密钥,OpenSSH 可能在轮到正确那把之前就用光了尝试次数,于是你会看到 Permission denied (publickey)。明确指定密钥:

ssh -i ~/.ssh/id_ed25519 -o IdentitiesOnly=yes -p 40123 root@sh-us-tx-01.ssh.superheat.dev

实例部署之后没有办法给它换一把密钥。先在 SSH 密钥中添加你想用的密钥,然后再部署。参见添加密钥

用主机条目代替一长串命令

Host superheat
HostName sh-us-tx-01.ssh.superheat.dev
Port 40123
User root
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes

之后就可以用 ssh superheatscp -r ./data superheat:/workspace/ 等等。启动之后记得更新 HostNamePort

Agent 转发

当实例需要以你的身份进行认证时——比如克隆一个私有仓库——转发你本地的 agent,这样就不会有任何私钥被写到实例上:

ssh -A -p 40123 root@sh-us-tx-01.ssh.superheat.dev

或者在上面的主机条目中加上 ForwardAgent yes

Agent 转发等于把你的密钥借了出去

在会话打开期间,那个容器上任何拥有 root 权限的东西都可以用你转发过去的 agent,在任何接受你密钥的地方以你的身份认证。按连接单独开启转发,不要全局开启;无人值守的工作优先使用仅限单个仓库的部署密钥。

数据的传入与传出

scp 用大写的 -P 指定端口,不是 ssh 用的那个 -p

# push a dataset up
scp -P 40123 -r ./data root@sh-us-tx-01.ssh.superheat.dev:/workspace/data

# pull checkpoints back down
scp -P 40123 -r root@sh-us-tx-01.ssh.superheat.dev:/workspace/checkpoints ./checkpoints

Superheat 基础镜像里装了 rsync,对于体量大或需要重复传输的场景它是更好的选择,因为 -P 会续传未完成的传输,而不是从头再来:

# up
rsync -avP -e "ssh -p 40123" ./data/ root@sh-us-tx-01.ssh.superheat.dev:/workspace/data/

# down
rsync -avP -e "ssh -p 40123" root@sh-us-tx-01.ssh.superheat.dev:/workspace/checkpoints/ ./checkpoints/

结尾的斜杠对 rsync 是有意义的:./data/ 复制的是 data 里的内容,./data 复制的是这个目录本身。

销毁会删除磁盘

没有快照,也没有撤销。销毁实例之前,把任何你想保留的东西拷贝出来。参见停止与销毁的对比

相关内容