Docs · อ้างอิง

SSH

SSH จาก Mac ไป guest — ที่อยู่ที่ใช้ได้จริง บรรทัดเดียวที่เพิ่มใน ssh config คีย์ บัญชี และความเชื่อถือ host key

SSH ปิดบนทุกเครื่อง จนกว่าคุณจะเปิด การเปิดใช้เปิดเส้นทาง login เข้า guest และไม่ใช่สิ่งที่ใครควรได้โดยบังเอิญ

1vm ssh enable dev
1vm ssh config --install     # add the Include line to ~/.ssh/config
ssh dev                      # plain ssh now resolves the machine

ยังมีหน้า Configure → SSH ในแอปที่มีการควบคุมเดียวกัน ไม่มี front end ใดห่ออีกฝ่าย

ที่อยู่ที่ใช้ได้จริง

ส่วนนี้ทำให้คนสะดุด และขึ้นกับเอนจิ้น ที่อยู่ guest ที่เห็นใน 1vm list ไม่ใช่ทุกครั้งที่เชื่อมต่อได้

EngineNetworkMac → guest
Virtualization.frameworkNAT or host-onlyDirect, to the guest's 192.168.64.x lease
Virtualization.frameworkBridgedDirect, to its LAN address
1VM engineNAT or host-onlyThrough a loopback port forward only
1VM engineBridgedDirect, to its LAN address

บนเอนจิ้น 1VM guest อยู่หลัง network stack โหมด user ที่ 10.0.2.15 คงที่ และ Mac ไม่มีอินเทอร์เฟซบน subnet นั้น ssh 10.0.2.15 ใช้ไม่ได้ที่นั่น สิ่งที่ใช้ได้คือ forward:

ssh -p 2222 onevm@127.0.0.1

การเปิด SSH สร้าง forward นั้นให้ และใช้ สด — ไม่ต้อง reboot forward bind 127.0.0.1 ดังนั้นการเปิด SSH ไม่เปิด guest ให้เครือข่าย

บรรทัดเดียวที่เพิ่มใน ssh config

1vm ssh config --install เพิ่มบล็อกที่คั่นด้วย sentinel หนึ่งบล็อกพอดี ที่ด้านบนของ ~/.ssh/config:

# >>> 1VM managed >>> do not edit this block
Include ~/Library/Application Support/OneVM/VMs/.ssh/config
# <<< 1VM managed <<<

ส่วนที่เหลือสร้างใน .ssh/ ของไลบรารีเอง ดังนั้นไฟล์ของคุณเหลือบรรทัดเดียวและ 1VM เป็นเจ้าของส่วนที่เหลือ ONEVM_HOME ย้ายทั้งก้อน หมายความว่าไลบรารีในโปรเจกต์มี ssh config ของตัวเอง

กฎที่ปฏิบัติ เพราะแก้ไฟล์ที่ไม่ได้เป็นเจ้าของ:

  • ด้านบนของไฟล์ เพราะ ssh_config เป็น first-obtained-wins — Include วางหลังบล็อก Host * ที่มีอยู่จะแพ้เงียบๆ
  • Idempotent รันสิบครั้งเหลือบล็อกเดียว
  • Atomic พร้อม backup ต้นฉบับคัดลอกไป config.1vm-backup-… ก่อนเขียน
  • ย้อนกลับได้ --uninstall ลบเฉพาะบล็อก sentinel --print แสดงโดยไม่เขียน
  • ปฏิเสธแทนเรียงใหม่ ถ้า config ตั้งตัวเลือกสำหรับ host ทั้งหมดเหนือที่บล็อกจะไป 1VM บอกและปฏิเสธ แทนการจัดไฟล์ใหม่
  • ไม่บัง host จริง ถ้าชื่อเครื่อง resolve อยู่แล้วใน ssh config จะ emit เฉพาะ alias <name>.1vm

บล็อกที่สร้างหน้าตาแบบนี้ — พอร์ตและที่อยู่มาจากกฎ reachability ด้านบน ไม่ใช่ IP guest ดิบ:

Host dev dev.1vm
    HostName 127.0.0.1
    Port 22417
    User dev
    IdentityFile ".../dev.vm/agent-key"
    IdentitiesOnly yes
    AddressFamily inet
    StrictHostKeyChecking yes
    ConnectTimeout 5

คีย์

แต่ละเครื่องมี Ed25519 key ของตัวใน bundle ที่ agent-key โหมด 0600 เพราะอยู่ในโฟลเดอร์ 1vm clone พาไปด้วยและโคลนเข้าถึงได้ด้วย identity เดียวกัน

คุณใช้คีย์ของตัวเองแทนได้ 1VM เก็บ path และคัดลอกเฉพาะ .pub ที่ตรงเข้า guest — ไม่อ่าน คัดลอก หรือเก็บครึ่ง private

1vm ssh keys dev                    # show the machine key
1vm ssh keys dev --print-public     # the public line
1vm ssh keys dev --regenerate       # new keypair
1vm set dev ssh.identityFile ~/.ssh/id_ed25519

บัญชี

1vm set dev ssh.users … จัดการว่ามีบัญชีใดใน guest ชื่อถูกตรวจตามครอบครัว guest — Linux และ macOS รับ [a-z_][a-z0-9_-]{0,31} Windows จำกัด 20 ตัวอักษรและปฏิเสธเครื่องหมายสงวน — และสมาชิก admin map ไป wheel/sudo, Administrators, หรือ admin ตามลำดับ

onevm สงวน เป็นบัญชีที่ 1vm exec, 1vm task run และเซิร์ฟเวอร์ MCP login ดังนั้นเปลี่ยนชื่อหรือลบจะพัง หน้าต่างแสดงเป็นแถวล็อกที่ label เป็นบัญชี agent แทนการซ่อน — login ที่มีอยู่แต่มองไม่เห็นในรายการ login จะเป็นการโกหก

root และ Administrator สงวนด้วย และ root login ปิดอยู่

ความเชื่อถือ host key

เครื่องมือส่วนใหญ่เชื่อสิ่งที่ตอบครั้งแรก 1VM ดีกว่า เพราะมีช่อง out-of-band: อ่าน public host key ของ guest ผ่านช่อง guest-agent ซึ่งไม่ traverse เครือข่ายที่ถูก authenticate และปักหมุด

StateWhat you seeWhat ssh does
Not learned yet"the first connection will trust whatever answers"StrictHostKeyChecking accept-new
Learnedthe SHA256:… fingerprint and the dateStrictHostKeyChecking yes
Mismatcha warning naming the date the old key was pinned, and a Relearn buttonyes — so the connection correctly fails
1vm ssh trust dev              # pin the current host key
1vm ssh trust dev --relearn    # re-pin after a legitimate change

ความไม่ตรงกันเป็นเรื่องปกติหลัง 1vm reset หลัง restore snapshot ก่อนมี sshd หรือหลัง reinstall และก็เหมือนการโจมตีพอดี — จึงเป็นปุ่มที่คุณกดเสมอ ไม่ใช่ overwrite เงียบๆ

การโคลน identity key คัดลอกไปโคลนโดยตั้งใจ host-key pin ไม่ เพราะสองเครื่องแสดง host key เดียวเป็นปัญหาจริง ใช้ 1vm clone dev test --rekey-ssh เพื่อ regenerate host key ของ guest ตอนบูตครั้งแรก

ค่าเริ่มต้นความปลอดภัย

  • auth เฉพาะคีย์ password และ keyboard-interactive auth ปิด root login ปิด และไม่มี agent หรือ X11 forwarding
  • forward bind loopback ดังนั้น guest ไม่ถูกเปิดให้ LAN เมื่อเปิด SSH การ bind ที่อยู่สาธารณะทำได้แต่เตือนเป็นคำพูดตรงๆ ว่าหมายความว่าอะไร
  • วัสดุ private key และอาร์กิวเมนต์สร้างบัญชีไปช่อง private เท่านั้นและไม่ถึง log

โหมด rollback ลบบัญชี SSH

โหมด rollback ทิ้งทุกอย่างที่เขียนตั้งแต่บูตตอนปิดเครื่อง — รวมบัญชีและคีย์ที่ provision ใน guest นี่ไม่ใช่บั๊ก และ 1VM จัดการโดยรัน provisioning ทุกบูตแทนการเชื่อไฟล์ marker คาดว่า guest host key จะเปลี่ยนทุกครั้งด้วย

Guest ไป Mac

ทิศทางย้อน — SSH จาก guest ไป Mac ของคุณ — ถึง Mac ที่ 10.0.2.2 บนเอนจิ้น 1VM และเฉพาะพอร์ตที่มีบริการลงทะเบียน 1VM จะไม่เปิด macOS Remote Login ให้ นั่นยังเป็นสิ่งที่คุณตัดสินใน System Settings

สถานะปัจจุบัน

SSH implement ทั่วแอป CLI และทั้งสองเอนจิ้น และครอบคลุมโดยชุดทดสอบ unit ข้อจำกัดตรงๆ สองข้อ:

  • การทดสอบ soak guest สดยังเป็น acceptance gate ที่ค้าง
  • Omarchy factory image ที่ส่งมาก่อน openssh ถูกเพิ่ม ในรายการแพ็กเกจ ดังนั้น Omarchy guest จากโรงงานไม่มี sshd จนกว่าจะ rebuild image Linux guest อื่นไม่ได้รับผล