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 ไม่ใช่ทุกครั้งที่เชื่อมต่อได้
| Engine | Network | Mac → guest |
|---|---|---|
| Virtualization.framework | NAT or host-only | Direct, to the guest's 192.168.64.x lease |
| Virtualization.framework | Bridged | Direct, to its LAN address |
| 1VM engine | NAT or host-only | Through a loopback port forward only |
| 1VM engine | Bridged | Direct, 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 และปักหมุด
| State | What you see | What ssh does |
|---|---|---|
| Not learned yet | "the first connection will trust whatever answers" | StrictHostKeyChecking accept-new |
| Learned | the SHA256:… fingerprint and the date | StrictHostKeyChecking yes |
| Mismatch | a warning naming the date the old key was pinned, and a Relearn button | yes — 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 อื่นไม่ได้รับผล