ข้ามไปยังเนื้อหา

SSH

บันทึกเมื่อ 2026-07-28 จาก CE หนึ่งตัวของการปรับใช้นี้ sitecli/capture-manifest.json บันทึกโหนดที่ใช้ และ scripts/capture-sitecli.sh --check ตรวจสอบพื้นผิวคำสั่งอีกครั้ง กับ CE ที่ใช้งานจริง

SSH เข้าถึงบัญชี admin ของอุปกรณ์ ซึ่งมี login 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 prompt ให้ลงจอด: login shell ของ admin คือ Site CLI ดังนั้นคุณจะมาถึง ที่พรอมต์ >>> ของมัน เรียกใช้คำสั่งบนกล่องด้วย execcli <name> ที่นั่น — ดู คำสั่งบนกล่อง

admin_user_credentials.ssh_key บน site object ดูเหมือนฟิลด์สำหรับสิ่งนี้พอดี มันได้รับการยอมรับ มันคงอยู่หลังจาก read-back และมันไม่ได้กำหนดค่าอะไรเลย vpm เป็นเจ้าของ ผู้ใช้ในเครื่องของโหนดและปฏิเสธที่จะแตะตัวนี้ — จากล็อกของโหนดเอง สามครั้ง ในการบูตครั้งเดียว:

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

ทุกอย่างที่ตามมาเป็นผลจากบรรทัดเดียวนั้น /var/home/admin/.ssh ไม่เคยมีอยู่ ก่อนหรือ หลังจากที่ไซต์ถึง ONLINE วันที่เปลี่ยน shadow ของ admin คงอยู่ที่วันที่สร้าง image ในขณะที่ vesbkp และ vesopcon แสดงวันที่ปัจจุบัน เพราะ vpm ตั้งค่าทั้งสองนั้น และข้าม admin ไป และ vpm ไม่บันทึกอะไรเกี่ยวกับ ssh_key หรือ authorized_keys เลยในทุกจุด

ดังนั้นไฟล์จึงต้องเขียนนอก vpm admin คือ uid 2202 ที่ฝังอยู่ใน image ของโหนด ดังนั้นมันมีอยู่ก่อนที่ cloud-init จะทำงาน และ owner: admin:admin จะแก้ไขได้ตอนเขียน — ไม่ต้องมี runcmd ไม่ต้องแก้ไข ownership:

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

sshd พร้อมอยู่เสมอ sshd -T รายงาน pubkeyauthentication yes และ admin ปรากฏใน AllowUsers ในไฟล์ sshd_config ทั้งสองที่มาพร้อมกับโหนด ไม่เคยมีอะไร ที่ต้องเปิดใช้งาน — มีแค่ไฟล์ที่หายไป

sshd ผูก 0.0.0.0:22 แต่มีเฉพาะที่อยู่ ภายใน (SLI) เท่านั้นที่อยู่บน host network stack ในแบบที่ sshd จะตอบสนอง eth0 ถูกเปลี่ยนชื่อเป็น a-i-eth0 และไม่มี host IP เลย — Argo data plane เป็นเจ้าของอินเทอร์เฟซนั้น และที่อยู่ management/SLO ที่มันจะถือ ปรากฏบน vhost0 แทน NIC อีกสองตัวยังคงอยู่บน host stack ภายใต้ชื่อของตัวเอง

ทดสอบจาก VM ภายใน 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)

การทดสอบกับที่อยู่ที่คุณรู้จักโหนดจึงคืนค่าเหมือนกับที่ security group ปิดอยู่ ไม่มีอะไรบล็อกมัน ไม่มี listener บนที่อยู่นั้น

ที่อยู่สาธารณะของ CE ก็ไม่มี listener บน 22 เช่นกัน ซึ่งเป็นสาเหตุที่คำสั่งด้านบน ผ่าน -J: VM ของผู้ดำเนินการภายใน VNet ในซับเน็ตเดียวกับที่อยู่ SLI การปรับใช้นี้สร้างขึ้นมาหนึ่งตัวเพื่อจุดประสงค์นี้ — terraform output -raw client_vm_name ตั้งชื่อมัน

login shell ของ admin ไม่ใช่ shell มันคือแอปพลิเคชัน go-prompt ซึ่งนำเทอร์มินัล เข้าสู่ raw mode และอ่าน keystrokes แทนที่จะเป็นบรรทัด มีผลสี่ประการ แต่ละอย่างล้มเหลว ในแบบที่ดูเหมือนปัญหาคนละอย่าง:

กลไกสิ่งที่เกิดขึ้นหากไม่มี
จัดสรรเทอร์มินัล (ssh -tt)panic: no such device or address จาก go-prompt.NewStandardInputParser ซึ่งอ่านดูเหมือนอุปกรณ์ที่ crash
ส่ง carriage return ไม่ใช่ line feed สำหรับ Enterบรรทัดไม่เคยถูกส่ง และเซสชันปิดเมื่อ end-of-input โดยไม่พิมพ์อะไร
เปิด standard input ไว้การเชื่อมต่อสิ้นสุดก่อนที่คำสั่งจะแสดงผล ดังนั้นคำสั่งที่ทำงานได้จะดูเหมือนไม่มีเสียง
เขียนข้อความคำสั่งและไบต์ Enter แยกกันnewline ลงเอยในบัฟเฟอร์เป็นอักขระตัวอักษรและ CLI ตอบ unknown command ซึ่งอ่านดูเหมือนคำสั่งไม่มีอยู่

ssh host 'some-command' จึงใช้ไม่ได้: อาร์กิวเมนต์ถูกเพิกเฉยและ prompt แบบโต้ตอบ เริ่มต้นอยู่ดี ให้ขับเคลื่อนมันเป็นเทอร์มินัลหรือไม่ก็เลิก scripts/sitecli_ssh_harvest.py คือ reference implementation

ก่อนที่คุณจะพิมพ์อะไร login banner ได้ตอบคำถามหลายข้อที่คุณจะต้องใช้คำสั่งไปถามไปแล้ว จาก f5-xc-ce-vm-01 ASCII art และ public 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 คือ build string ที่กำหนดว่าคำสั่งใดมีอยู่ DNS และ NTP ครอบคลุมสองข้อกำหนดที่ทำลายการลงทะเบียนก่อน ดังนั้นโหนดที่ไม่เคย ออนไลน์มักจะบอกคุณว่าทำไมที่นี่แล้ว — ก่อนที่จะต้องใช้ chronyc-sources หรือ dig เลย

  1. สร้าง keypair หากคุณยังไม่มี Ed25519 แทนที่จะเป็น RSA: สั้นกว่า และได้รับการยอมรับจาก sshd ของอุปกรณ์

    Terminal window
    ssh-keygen -t ed25519 -C "ce-operator" -f ~/.ssh/id_ed25519
  2. ชี้การปรับใช้ไปที่ครึ่ง สาธารณะ root module อ่านไฟล์ครั้งเดียว และส่ง string ลงไปทุกโหนด:

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

    ssh_public_key รับเนื้อหา inline แทน ซึ่งเป็นสิ่งที่ plan tests ใช้ ครึ่งส่วนตัวไม่เคยออกจากเวิร์กสเตชันของคุณ

  3. Apply อ่านคำเตือนที่ด้านบนของหน้านี้ก่อน — บนการปรับใช้ที่มีอยู่ สิ่งนี้ จะแทนที่ CE VM

แต่ละอย่างเหล่านี้ได้รับการทดสอบและถูกตัดออกในขณะที่ยังเชื่อว่าเส้นทางนั้นเป็นไปไม่ได้ แต่ละอย่างมีความน่าเชื่อถือพอที่จะเสียเวลาได้หนึ่งวัน

ไม่ใช่สาเหตุวิธีที่ถูกตัดออก
credential ใช้ได้เฉพาะตอน create เท่านั้นsshd เริ่มต้นประมาณ 90 วินาทีหลังบูตครั้งแรก ก่อนที่ site object จะมีอยู่ admin_user_credentials ยังปรากฏใน ReplaceSpecType และใช้ in place
block_all_servicesการปิดพอร์ต 22 บนที่อยู่ management เหมือนกันไม่ว่าบริการจะถูกบล็อกหรือไม่
trailing newline บนคีย์ทดสอบทั้งสองแบบ ไม่มีการเปลี่ยนแปลง cloud-init ยังคง strip มันออก เพราะ literal block จะแสดงผลเป็นบรรทัดที่สอง ว่าเปล่า
CE software เวอร์ชันเก่าที่ถูก pinทำซ้ำได้บนสาม builds รวมถึงหนึ่งที่รัน OpenSSH 9.9
admin_password ที่หายไปการตั้ง admin_password ควบคู่กับ ssh_key บน CE ที่สร้างจากศูนย์ไม่ได้เปลี่ยนแปลงอะไร