跳到內容

SSH

擷取自本部署其中一個 CE,時間為 2026-07-28。sitecli/capture-manifest.json 記錄了所在節點,scripts/capture-sitecli.sh --check 可對照線上 CE 重新驗證命令介面。

SSH 可連線至應用裝置的 admin 帳號,其登入 Shell 為 Site CLI (/opt/bin/vpmu)。這是存取完整機上命令介面的唯一途徑—— debug API 提供 34 個命令,而應用裝置本身還提供許多該 API 完全未收錄的命令。

Terminal window
cd terraform
SLI=$(terraform output -json ce_sli_private_ips | jq -r '.eastus01')
ssh -tt -i ~/.ssh/id_ed25519 -J azureuser@<operator-vm> "admin@$SLI"

該命令列的每個部分都不可或缺,接下來三節將分別說明各部分所預防的失敗情況。

連線後不會出現 Shell 提示字元:admin 的登入 Shell 就是 Site CLI,因此您將直接進入其 >>> 提示字元。在此處以 execcli <name> 執行機上命令——詳見機上命令

為何由 cloud-init 寫入金鑰,而非透過 API

Section titled “為何由 cloud-init 寫入金鑰,而非透過 API”

站台物件上的 admin_user_credentials.ssh_key 看起來正是用於此目的的欄位。它可被接受,讀回後也仍存在,但它不配置任何東西。vpm 擁有節點的本地使用者,並拒絕處理這個帳號——從節點自身的日誌中,在單次開機過程中出現了三次:

vpm users.go:165: Won't do any change for user admin (internal skip)

一切後續問題都源於這一行。/var/home/admin/.ssh 在站台達到 ONLINE 前後均不存在。admin 的 shadow 最後變更日期停留在映像建立日期,而 vesbkpvesopcon 則顯示當前日期,因為 vpm 設置了這兩者並跳過了 admin。且 vpm 在任何時候都未記錄關於 ssh_keyauthorized_keys 的任何內容。

因此,必須在 vpm 之外寫入此檔案。admin 的 uid 為 2202,已內建於節點映像中,因此在 cloud-init 執行之前它就已存在,且 owner: admin:admin 在寫入時即可解析——無需 runcmd,無需事後修正擁有權:

- path: /var/home/admin/.ssh/authorized_keys
permissions: "0600"
owner: admin:admin
content: |
${ssh_public_key}

sshd 一直都願意配合。sshd -T 報告 pubkeyauthentication yes,且 admin 出現在節點上兩個 sshd_config 檔案的 AllowUsers 中。從來不需要啟用任何東西——只是缺少一個檔案。

sshd 綁定 0.0.0.0:22,但只有**內部(SLI)**位址是以 sshd 會回應的方式存在於主機網路堆疊中。eth0 被重新命名為 a-i-eth0,且完全不攜帶主機 IP——Argo 資料平面擁有該介面,而原本應在其上的管理/SLO 位址改由 vhost0 承載。其他兩個 NIC 則以各自的名稱保留在主機堆疊中。

從 VNet 內的虛擬機器對一個 CE 進行探測:

management/SLO address timed out
external address timed out
internal/SLI address OPEN SSH-2.0-OpenSSH_8.7
an unused address timed out (control)

因此,對您所知的節點位址進行探測,其返回結果與封閉的安全群組完全相同。沒有任何東西阻擋它;只是那個位址上沒有監聽器。

CE 的公開位址在連接埠 22 上也沒有監聽器,這就是上述命令透過 -J 連線的原因:一個位於 VNet 內部、與 SLI 位址同子網路的操作者虛擬機器。本部署為此專門建置了一個——terraform output -raw client_vm_name 可查看其名稱。

Site CLI 需要終端機以及歸位字元(Carriage Return)

Section titled “Site CLI 需要終端機以及歸位字元(Carriage Return)”

admin 的登入 Shell 不是一般的 Shell。它是一個 go-prompt 應用程式,會將終端機切換至原始模式並讀取按鍵而非整行輸入。這帶來四個後果,每一個的失敗方式看起來都像是不同的問題:

機制缺少時的情況
配置終端機(ssh -ttgo-prompt.NewStandardInputParser 觸發 panic: no such device or address,看起來像是應用裝置崩潰
按下 Enter 時傳送歸位字元而非換行字元該行永遠不會被提交,工作階段在輸入結束時關閉且未印出任何內容
保持標準輸入開啟命令完成渲染之前連線已結束,因此正常運作的命令看起來沒有任何輸出
分別傳送命令文字與 Enter 位元組換行字元作為字面字元落入緩衝區,CLI 回應 unknown command,看起來像是命令不存在

因此,ssh host 'some-command' 無法使用:參數會被忽略,互動式提示字元照常啟動。必須以終端機方式驅動,否則完全無法使用。scripts/sitecli_ssh_harvest.py 是參考實作。

登入橫幅是一次免費的健康檢查

Section titled “登入橫幅是一次免費的健康檢查”

在您輸入任何內容之前,登入橫幅已經回答了幾個您原本需要花費命令才能查明的問題。來自 f5-xc-ce-vm-01,ASCII 藝術字與公開 IP 已省略:

UNAUTHORIZED ACCESS TO THIS DEVICE IS PROHIBITED
All actions performed on this device are audited
Using https://register.ves.volterra.io
OS: rhel-9.2024.6
Memory: 32768MiB
Storage: sda: 31GiB
CPU: Model: Intel(R) Xeon(R) Platinum 8272CL CPU @ 2.60GHz | CPUs: 8
Software: crt-20250613-3382
DNS: 168.63.129.16: OK
NTP: Synced
Uptime: 0 days, 5 hours, 20 minutes
Registration Status: PROVISIONED
SLO IP: 10.0.1.4/26
WELCOME IN SITE CLI

Registration Status 可區分仍在啟動中的節點(PROVISIONING)和已完成的節點(PROVISIONED)。Software 是決定哪些命令存在的建置字串。DNSNTP 涵蓋了最先導致註冊失敗的兩個相依項目,因此從未上線的節點通常在這裡就已告知原因——在需要 chronyc-sourcesdig 之前。

  1. 如果您尚未擁有金鑰對,請產生一個。使用 Ed25519 而非 RSA:更短,且被應用裝置 sshd 所接受。

    Terminal window
    ssh-keygen -t ed25519 -C "ce-operator" -f ~/.ssh/id_ed25519
  2. 鑰指向部署。根模組讀取檔案一次,並將字串傳遞至每個節點:

    terraform/terraform.tfvars
    ssh_public_key_path = "~/.ssh/id_ed25519.pub"

    ssh_public_key 改為直接接受內容字串,這是計畫測試所使用的方式。私鑰永遠不會離開您的工作站。

  3. 套用。在套用之前請先閱讀本頁頂部的警告——在現有部署上,這將替換 CE 虛擬機器。

以下每項都曾在此途徑仍被認為不可能時進行過測試並排除。每一項都有足夠的可信度讓人花費一天時間。

非原因排除方式
憑證僅在建立時套用sshd 在首次開機約 90 秒後啟動,此時站台物件尚不存在。admin_user_credentials 也存在於 ReplaceSpecType 中,並就地套用。
block_all_services無論服務是否被封鎖,管理位址上連接埠 22 的關閉情況完全相同。
金鑰末尾的換行字元兩種方式均已測試,無變化。cloud-init 仍會將其去除,因為否則字面區塊會渲染出第二個空行。
已固定的舊版 CE 軟體已在三個建置上重現,包括一個執行 OpenSSH 9.9 的建置。
缺少 admin_password在從頭建立的 CE 上同時設定 admin_passwordssh_key 並無任何改變。