透過 SSH 連線
複製連線指令
從 執行個體 開啟該執行個體,並停留在 連線 頁籤。指令已經替你算好,主機、連接埠與使用者都填好了:
ssh -p 40123 root@sh-us-tx-01.ssh.superheat.dev
請用旁邊的複製按鈕,不要自己重打各個部分。連線資訊只有在執行個體進入 running 之後才會出現;在那之前,頁籤會告訴你它們還沒準備好。
除非算好的指令另有說明,否則使用者是 root。驗證使用你在部署時附加的 SSH 金鑰。
為什麼連接埠不是 22
在容器內,sshd 監聽 22。該連接埠接著被發布到主機的某個連接埠上,取自該主機可用的範圍,而你連的是那個主機連接埠。號碼在啟動時指派,每個執行個體都不同,而且和 22 一點關係都沒有。
有兩個後果值得記住:
不加 -p 就 ssh root@sh-us-tx-01.ssh.superheat.dev | 會失敗,或連到不是你執行個體的東西 |
| 停止再啟動之後的主機與連接埠 | 會重新簽發,所以可能不是你之前用的那一組 |
每次啟動後都從 連線 頁籤重新複製指令,不要依賴 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 裡只有部署時附加的那把金鑰。如果你的 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 項目取代冗長的指令
Host superheat
HostName sh-us-tx-01.ssh.superheat.dev
Port 40123
User root
IdentityFile ~/.ssh/id_ed25519
IdentitiesOnly yes
然後就能用 ssh superheat、scp -r ./data superheat:/workspace/ 等等。啟動之後記得更新 HostName 與 Port。
Agent 轉送
當執行個體需要以你的身分進行驗證時 — 例如複製私有儲存庫 — 就轉送你本機的 agent,這樣才不會有任何私密金鑰被寫到執行個體上:
ssh -A -p 40123 root@sh-us-tx-01.ssh.superheat.dev
或是在上面的 host 項目中加上 ForwardAgent yes。
在工作階段開著的期間,任何在該容器上擁有 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
rsync 已安裝在 Superheat 基礎映像檔中,對於任何大型或重複的傳輸都是更好的選擇,因為 -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 複製的是目錄本身。
沒有快照,也沒有回復。在銷毀之前,先把任何你想留下的東西從執行個體複製出來。請見停止與銷毀的差別。