# การเข้าถึง SSH ผ่านพร็อกซี เอเจนต์ต้องรันคำสั่งบนเครื่องระยะไกล — ดีพลอยคอนเทนเนอร์ อ่านล็อก แก้คอนฟิก การส่งคีย์ส่วนตัว SSH ดิบให้ LLM เป็นความคิดที่ไม่ดี: คีย์ลงเอยในหน้าต่างบริบท ล็อก และบันทึกถอดความ พร็อกซี SSH แก้ปัญหานี้: มันเป็นผู้ถือข้อมูลประจำตัว เอเจนต์พูดแค่ HTTP ## โมเดล ``` LLM ──HTTPS──► พร็อกซี SSH ──SSH──► เครื่องเป้าหมาย (ถือคีย์, บันทึกการตรวจสอบ, ขีดจำกัดอัตรา) ``` พร็อกซีเปิดเผยเซสชันถาวรด้วยพื้นผิว REST ที่เรียบง่าย: | เอนด์พอยต์ | วัตถุประสงค์ | |---|---| | `POST /connect?target=vps1` | เปิดเซสชัน → `session_id` | | `POST //exec` `{command, timeout}` | รันคำสั่ง (async) → `exec_id` | | `GET //exec/` | สำรวจเอาต์พุต | | เอนด์พอยต์ SFTP | อัป/ดาวน์โหลดไฟล์, `ls`, `mkdir`, `rm` | การยืนยันตัวตนเป็น Bearer token — รูปแบบเดียวกับทุก API อื่นที่คุณใช้ ## รูปแบบการดำเนินการ ```bash # 1. เชื่อมต่อครั้งเดียว ใช้เซสชันซ้ำตลอดงาน SID=$(curl -s -H "Authorization: Bearer $KEY" \ "https://ssh-proxy.example/connect?target=vps1" | jq -r .session_id) # 2. รันคำสั่ง EID=$(curl -s -H "Authorization: Bearer $KEY" -H "Content-Type: application/json" \ -X POST "https://ssh-proxy.example/$SID/exec" \ -d '{"command": "docker ps --format \"{{.Names}}\"", "timeout": 120}' | jq -r .exec_id) # 3. สำรวจผลลัพธ์ curl -s -H "Authorization: Bearer $KEY" "https://ssh-proxy.example/$SID/exec/$EID" ``` ## กฎการปฏิบัติ 1. **ใช้เซสชันซ้ำ** การเชื่อมต่อต่อคำสั่งเปลืองทรัพยากรและกระตุ้นขีดจำกัดอัตรา เก็บ `session_id` (เช่น `/tmp/vps1_sid`) และส่ง heartbeat ก่อนใช้ซ้ำ 2. **ตั้งชื่อเป้าหมาย อย่าไปค้นมัน** เป้าหมายลงทะเบียนล่วงหน้า (`vps1`, `pi`, …) พร็อกซีคือแหล่งความจริงเดียว — ห้ามฮาร์ดโค้ดที่อยู่ IP ในโค้ดเอเจนต์ 3. **เลือก SFTP มากกว่า cat/heredoc ของเชลล์สำหรับไฟล์** การหนีบีบข้อมูลไบนารีผ่าน `exec`ทำให้เพย์โหลดเสียหาย ใช้เอนด์พอยต์อัป/ดาวน์โหลดเฉพาะทาง 4. **อ้างคำสั่งของคุณ** ตัว JSON ถูกแยกวิเคราะห์สองครั้ง (HTTP + เชลล์) ห่อคำสั่งระยะไกลด้วยเครื่องหมายคำพูดเดี่ยวและคงเป็นบรรทัดเดียว 5. **สมมติว่ามีการตรวจสอบ** ทุก exec ลงในบันทึกการตรวจสอบของพร็อกซี — ปฏิบัติตัวเหมือนมนุษย์อ่านทุกอย่าง (เขาทำได้) ## เมื่อไรไม่ควรใช้ exec - อ่านสถานะที่มีโครงสร้างซึ่งมี API (Docker, ฐานข้อมูล, Mind API ของ Synapse) — เลือก API มากกว่าการแยกวิเคราะห์เอาต์พุต CLI เสมอ - กระบวนการเชิงโต้ตอบที่ใช้เวลานาน `exec`เป็น fire-and-forget ที่มีหมดเวลา; ใช้ `nohup` + ไฟล์สถานะบนเป้าหมายแทน - สิ่งทำลายล้างอะไรก็ตามโดยไม่มีคำสั่งชัดเจน พร็อกซีให้พลังแก่คุณ — มนุษย์ให้การอนุญาตแก่คุณ ## การกู้คืนจากข้อผิดพลาด | อาการ | วิธีแก้ | |---|---| | 401 ตอน connect | โทเคนหมดอายุ — อ่านใหม่จาก memory/settings ไม่เคยจากบันทึกถอดความ | | เซสชัน 404 | เซสชันหมดอายุ (จำกัด 24 ชม.) — เชื่อมต่อใหม่ | | exec หมดเวลา | เพิ่ม `timeout` หรือแยกคำสั่ง; ตรวจโหลดของเป้าหมาย | | เนื้อหาไฟล์เสียหาย | คุณใช้ `exec` แทน SFTP — เปลี่ยนไปใช้เอนด์พอยต์ SFTP |