{"title":"การเข้าถึง SSH ผ่านพร็อกซี","slug":"ssh-proxy-access","category":"llm-cookbook","summary":"เอเจนต์ LLM รันคำสั่งบนเครื่องระยะไกลอย่างปลอดภัยผ่าน API พร็อกซี SSH แทนคีย์ SSH ดิบอย่างไร","audience":["llm"],"tags":["cookbook","ssh","proxy","infrastructure","remote-execution"],"difficulty":"intermediate","updated":"2026-09-26","word_count":192,"read_minutes":1,"llm_context":"อย่าเก็บคีย์ส่วนตัว SSH ดิบในฐานะ LLM โดยเด็ดขาด ใช้ SSH-proxy HTTP API:\n1) POST /connect?target=<name> → session_id (ถาวร อยู่ได้หลายชั่วโมง)\n2) POST /<session_id>/exec {command, timeout} → exec_id\n3) GET /<session_id>/exec/<exec_id> → เอาต์พุตเมื่อเสร็จ\n4) ใช้เอนด์พอยต์ SFTP สำหรับอัป/ดาวน์โหลดไฟล์แทน cat/heredoc\nเป้าหมายเป็นชื่อที่ลงทะเบียนล่วงหน้า (เช่น \"vps1\") ไม่ใช่ IP — พร็อกซีคือ\nที่เดียวที่ข้อมูลประจำตัวอาศัยอยู่\n","lang":"th","translated":true,"requested_lang":"th","content_markdown":"\n# การเข้าถึง SSH ผ่านพร็อกซี\n\nเอเจนต์ต้องรันคำสั่งบนเครื่องระยะไกล — ดีพลอยคอนเทนเนอร์ อ่านล็อก แก้คอนฟิก การส่งคีย์ส่วนตัว SSH ดิบให้ LLM เป็นความคิดที่ไม่ดี: คีย์ลงเอยในหน้าต่างบริบท ล็อก และบันทึกถอดความ พร็อกซี SSH แก้ปัญหานี้: มันเป็นผู้ถือข้อมูลประจำตัว เอเจนต์พูดแค่ HTTP\n\n## โมเดล\n\n```\nLLM ──HTTPS──► พร็อกซี SSH ──SSH──► เครื่องเป้าหมาย\n                (ถือคีย์,\n                 บันทึกการตรวจสอบ,\n                 ขีดจำกัดอัตรา)\n```\n\nพร็อกซีเปิดเผยเซสชันถาวรด้วยพื้นผิว REST ที่เรียบง่าย:\n\n| เอนด์พอยต์ | วัตถุประสงค์ |\n|---|---|\n| `POST /connect?target=vps1` | เปิดเซสชัน → `session_id` |\n| `POST /<sid>/exec` `{command, timeout}` | รันคำสั่ง (async) → `exec_id` |\n| `GET /<sid>/exec/<exec_id>` | สำรวจเอาต์พุต |\n| เอนด์พอยต์ SFTP | อัป/ดาวน์โหลดไฟล์, `ls`, `mkdir`, `rm` |\n\nการยืนยันตัวตนเป็น Bearer token — รูปแบบเดียวกับทุก API อื่นที่คุณใช้\n\n## รูปแบบการดำเนินการ\n\n```bash\n# 1. เชื่อมต่อครั้งเดียว ใช้เซสชันซ้ำตลอดงาน\nSID=$(curl -s -H \"Authorization: Bearer $KEY\" \\\n  \"https://ssh-proxy.example/connect?target=vps1\" | jq -r .session_id)\n\n# 2. รันคำสั่ง\nEID=$(curl -s -H \"Authorization: Bearer $KEY\" -H \"Content-Type: application/json\" \\\n  -X POST \"https://ssh-proxy.example/$SID/exec\" \\\n  -d '{\"command\": \"docker ps --format \\\"{{.Names}}\\\"\", \"timeout\": 120}' | jq -r .exec_id)\n\n# 3. สำรวจผลลัพธ์\ncurl -s -H \"Authorization: Bearer $KEY\" \"https://ssh-proxy.example/$SID/exec/$EID\"\n```\n\n## กฎการปฏิบัติ\n\n1. **ใช้เซสชันซ้ำ** การเชื่อมต่อต่อคำสั่งเปลืองทรัพยากรและกระตุ้นขีดจำกัดอัตรา เก็บ `session_id` (เช่น `/tmp/vps1_sid`) และส่ง heartbeat ก่อนใช้ซ้ำ\n2. **ตั้งชื่อเป้าหมาย อย่าไปค้นมัน** เป้าหมายลงทะเบียนล่วงหน้า (`vps1`, `pi`, …) พร็อกซีคือแหล่งความจริงเดียว — ห้ามฮาร์ดโค้ดที่อยู่ IP ในโค้ดเอเจนต์\n3. **เลือก SFTP มากกว่า cat/heredoc ของเชลล์สำหรับไฟล์** การหนีบีบข้อมูลไบนารีผ่าน `exec`ทำให้เพย์โหลดเสียหาย ใช้เอนด์พอยต์อัป/ดาวน์โหลดเฉพาะทาง\n4. **อ้างคำสั่งของคุณ** ตัว JSON ถูกแยกวิเคราะห์สองครั้ง (HTTP + เชลล์) ห่อคำสั่งระยะไกลด้วยเครื่องหมายคำพูดเดี่ยวและคงเป็นบรรทัดเดียว\n5. **สมมติว่ามีการตรวจสอบ** ทุก exec ลงในบันทึกการตรวจสอบของพร็อกซี — ปฏิบัติตัวเหมือนมนุษย์อ่านทุกอย่าง (เขาทำได้)\n\n## เมื่อไรไม่ควรใช้ exec\n\n- อ่านสถานะที่มีโครงสร้างซึ่งมี API (Docker, ฐานข้อมูล, Mind API ของ Synapse) — เลือก API มากกว่าการแยกวิเคราะห์เอาต์พุต CLI เสมอ\n- กระบวนการเชิงโต้ตอบที่ใช้เวลานาน `exec`เป็น fire-and-forget ที่มีหมดเวลา; ใช้ `nohup` + ไฟล์สถานะบนเป้าหมายแทน\n- สิ่งทำลายล้างอะไรก็ตามโดยไม่มีคำสั่งชัดเจน พร็อกซีให้พลังแก่คุณ — มนุษย์ให้การอนุญาตแก่คุณ\n\n## การกู้คืนจากข้อผิดพลาด\n\n| อาการ | วิธีแก้ |\n|---|---|\n| 401 ตอน connect | โทเคนหมดอายุ — อ่านใหม่จาก memory/settings ไม่เคยจากบันทึกถอดความ |\n| เซสชัน 404 | เซสชันหมดอายุ (จำกัด 24 ชม.) — เชื่อมต่อใหม่ |\n| exec หมดเวลา | เพิ่ม `timeout` หรือแยกคำสั่ง; ตรวจโหลดของเป้าหมาย |\n| เนื้อหาไฟล์เสียหาย | คุณใช้ `exec` แทน SFTP — เปลี่ยนไปใช้เอนด์พอยต์ SFTP |\n","content_html":"<h1>การเข้าถึง SSH ผ่านพร็อกซี</h1>\n<p>เอเจนต์ต้องรันคำสั่งบนเครื่องระยะไกล — ดีพลอยคอนเทนเนอร์ อ่านล็อก แก้คอนฟิก การส่งคีย์ส่วนตัว SSH ดิบให้ LLM เป็นความคิดที่ไม่ดี: คีย์ลงเอยในหน้าต่างบริบท ล็อก และบันทึกถอดความ พร็อกซี SSH แก้ปัญหานี้: มันเป็นผู้ถือข้อมูลประจำตัว เอเจนต์พูดแค่ HTTP</p>\n<h2>โมเดล</h2>\n<pre><code class=\"hljs language-plaintext\">LLM ──HTTPS──► พร็อกซี SSH ──SSH──► เครื่องเป้าหมาย\n                (ถือคีย์,\n                 บันทึกการตรวจสอบ,\n                 ขีดจำกัดอัตรา)</code></pre><p>พร็อกซีเปิดเผยเซสชันถาวรด้วยพื้นผิว REST ที่เรียบง่าย:</p>\n<table>\n<thead>\n<tr>\n<th>เอนด์พอยต์</th>\n<th>วัตถุประสงค์</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>POST /connect?target=vps1</code></td>\n<td>เปิดเซสชัน → <code>session_id</code></td>\n</tr>\n<tr>\n<td><code>POST /&lt;sid&gt;/exec</code> <code>{command, timeout}</code></td>\n<td>รันคำสั่ง (async) → <code>exec_id</code></td>\n</tr>\n<tr>\n<td><code>GET /&lt;sid&gt;/exec/&lt;exec_id&gt;</code></td>\n<td>สำรวจเอาต์พุต</td>\n</tr>\n<tr>\n<td>เอนด์พอยต์ SFTP</td>\n<td>อัป/ดาวน์โหลดไฟล์, <code>ls</code>, <code>mkdir</code>, <code>rm</code></td>\n</tr>\n</tbody></table>\n<p>การยืนยันตัวตนเป็น Bearer token — รูปแบบเดียวกับทุก API อื่นที่คุณใช้</p>\n<h2>รูปแบบการดำเนินการ</h2>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># 1. เชื่อมต่อครั้งเดียว ใช้เซสชันซ้ำตลอดงาน</span>\nSID=$(curl -s -H <span class=\"hljs-string\">&quot;Authorization: Bearer <span class=\"hljs-variable\">$KEY</span>&quot;</span> \\\n  <span class=\"hljs-string\">&quot;https://ssh-proxy.example/connect?target=vps1&quot;</span> | jq -r .session_id)\n\n<span class=\"hljs-comment\"># 2. รันคำสั่ง</span>\nEID=$(curl -s -H <span class=\"hljs-string\">&quot;Authorization: Bearer <span class=\"hljs-variable\">$KEY</span>&quot;</span> -H <span class=\"hljs-string\">&quot;Content-Type: application/json&quot;</span> \\\n  -X POST <span class=\"hljs-string\">&quot;https://ssh-proxy.example/<span class=\"hljs-variable\">$SID</span>/exec&quot;</span> \\\n  -d <span class=\"hljs-string\">&#x27;{&quot;command&quot;: &quot;docker ps --format \\&quot;{{.Names}}\\&quot;&quot;, &quot;timeout&quot;: 120}&#x27;</span> | jq -r .exec_id)\n\n<span class=\"hljs-comment\"># 3. สำรวจผลลัพธ์</span>\ncurl -s -H <span class=\"hljs-string\">&quot;Authorization: Bearer <span class=\"hljs-variable\">$KEY</span>&quot;</span> <span class=\"hljs-string\">&quot;https://ssh-proxy.example/<span class=\"hljs-variable\">$SID</span>/exec/<span class=\"hljs-variable\">$EID</span>&quot;</span></code></pre><h2>กฎการปฏิบัติ</h2>\n<ol>\n<li><strong>ใช้เซสชันซ้ำ</strong> การเชื่อมต่อต่อคำสั่งเปลืองทรัพยากรและกระตุ้นขีดจำกัดอัตรา เก็บ <code>session_id</code> (เช่น <code>/tmp/vps1_sid</code>) และส่ง heartbeat ก่อนใช้ซ้ำ</li>\n<li><strong>ตั้งชื่อเป้าหมาย อย่าไปค้นมัน</strong> เป้าหมายลงทะเบียนล่วงหน้า (<code>vps1</code>, <code>pi</code>, …) พร็อกซีคือแหล่งความจริงเดียว — ห้ามฮาร์ดโค้ดที่อยู่ IP ในโค้ดเอเจนต์</li>\n<li><strong>เลือก SFTP มากกว่า cat/heredoc ของเชลล์สำหรับไฟล์</strong> การหนีบีบข้อมูลไบนารีผ่าน <code>exec</code>ทำให้เพย์โหลดเสียหาย ใช้เอนด์พอยต์อัป/ดาวน์โหลดเฉพาะทาง</li>\n<li><strong>อ้างคำสั่งของคุณ</strong> ตัว JSON ถูกแยกวิเคราะห์สองครั้ง (HTTP + เชลล์) ห่อคำสั่งระยะไกลด้วยเครื่องหมายคำพูดเดี่ยวและคงเป็นบรรทัดเดียว</li>\n<li><strong>สมมติว่ามีการตรวจสอบ</strong> ทุก exec ลงในบันทึกการตรวจสอบของพร็อกซี — ปฏิบัติตัวเหมือนมนุษย์อ่านทุกอย่าง (เขาทำได้)</li>\n</ol>\n<h2>เมื่อไรไม่ควรใช้ exec</h2>\n<ul>\n<li>อ่านสถานะที่มีโครงสร้างซึ่งมี API (Docker, ฐานข้อมูล, Mind API ของ Synapse) — เลือก API มากกว่าการแยกวิเคราะห์เอาต์พุต CLI เสมอ</li>\n<li>กระบวนการเชิงโต้ตอบที่ใช้เวลานาน <code>exec</code>เป็น fire-and-forget ที่มีหมดเวลา; ใช้ <code>nohup</code> + ไฟล์สถานะบนเป้าหมายแทน</li>\n<li>สิ่งทำลายล้างอะไรก็ตามโดยไม่มีคำสั่งชัดเจน พร็อกซีให้พลังแก่คุณ — มนุษย์ให้การอนุญาตแก่คุณ</li>\n</ul>\n<h2>การกู้คืนจากข้อผิดพลาด</h2>\n<table>\n<thead>\n<tr>\n<th>อาการ</th>\n<th>วิธีแก้</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>401 ตอน connect</td>\n<td>โทเคนหมดอายุ — อ่านใหม่จาก memory/settings ไม่เคยจากบันทึกถอดความ</td>\n</tr>\n<tr>\n<td>เซสชัน 404</td>\n<td>เซสชันหมดอายุ (จำกัด 24 ชม.) — เชื่อมต่อใหม่</td>\n</tr>\n<tr>\n<td>exec หมดเวลา</td>\n<td>เพิ่ม <code>timeout</code> หรือแยกคำสั่ง; ตรวจโหลดของเป้าหมาย</td>\n</tr>\n<tr>\n<td>เนื้อหาไฟล์เสียหาย</td>\n<td>คุณใช้ <code>exec</code> แทน SFTP — เปลี่ยนไปใช้เอนด์พอยต์ SFTP</td>\n</tr>\n</tbody></table>\n","urls":{"html":"/docs/llm-cookbook/ssh-proxy-access","text":"/docs/llm-cookbook/ssh-proxy-access?format=text","json":"/docs/llm-cookbook/ssh-proxy-access?format=json","llm":"/docs/llm-cookbook/ssh-proxy-access?format=llm"},"translations_available":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"],"wordCount":192,"readMinutes":1,"llmContext":"อย่าเก็บคีย์ส่วนตัว SSH ดิบในฐานะ LLM โดยเด็ดขาด ใช้ SSH-proxy HTTP API:\n1) POST /connect?target=<name> → session_id (ถาวร อยู่ได้หลายชั่วโมง)\n2) POST /<session_id>/exec {command, timeout} → exec_id\n3) GET /<session_id>/exec/<exec_id> → เอาต์พุตเมื่อเสร็จ\n4) ใช้เอนด์พอยต์ SFTP สำหรับอัป/ดาวน์โหลดไฟล์แทน cat/heredoc\nเป้าหมายเป็นชื่อที่ลงทะเบียนล่วงหน้า (เช่น \"vps1\") ไม่ใช่ IP — พร็อกซีคือ\nที่เดียวที่ข้อมูลประจำตัวอาศัยอยู่\n","requestedLang":"th","contentMarkdown":"\n# การเข้าถึง SSH ผ่านพร็อกซี\n\nเอเจนต์ต้องรันคำสั่งบนเครื่องระยะไกล — ดีพลอยคอนเทนเนอร์ อ่านล็อก แก้คอนฟิก การส่งคีย์ส่วนตัว SSH ดิบให้ LLM เป็นความคิดที่ไม่ดี: คีย์ลงเอยในหน้าต่างบริบท ล็อก และบันทึกถอดความ พร็อกซี SSH แก้ปัญหานี้: มันเป็นผู้ถือข้อมูลประจำตัว เอเจนต์พูดแค่ HTTP\n\n## โมเดล\n\n```\nLLM ──HTTPS──► พร็อกซี SSH ──SSH──► เครื่องเป้าหมาย\n                (ถือคีย์,\n                 บันทึกการตรวจสอบ,\n                 ขีดจำกัดอัตรา)\n```\n\nพร็อกซีเปิดเผยเซสชันถาวรด้วยพื้นผิว REST ที่เรียบง่าย:\n\n| เอนด์พอยต์ | วัตถุประสงค์ |\n|---|---|\n| `POST /connect?target=vps1` | เปิดเซสชัน → `session_id` |\n| `POST /<sid>/exec` `{command, timeout}` | รันคำสั่ง (async) → `exec_id` |\n| `GET /<sid>/exec/<exec_id>` | สำรวจเอาต์พุต |\n| เอนด์พอยต์ SFTP | อัป/ดาวน์โหลดไฟล์, `ls`, `mkdir`, `rm` |\n\nการยืนยันตัวตนเป็น Bearer token — รูปแบบเดียวกับทุก API อื่นที่คุณใช้\n\n## รูปแบบการดำเนินการ\n\n```bash\n# 1. เชื่อมต่อครั้งเดียว ใช้เซสชันซ้ำตลอดงาน\nSID=$(curl -s -H \"Authorization: Bearer $KEY\" \\\n  \"https://ssh-proxy.example/connect?target=vps1\" | jq -r .session_id)\n\n# 2. รันคำสั่ง\nEID=$(curl -s -H \"Authorization: Bearer $KEY\" -H \"Content-Type: application/json\" \\\n  -X POST \"https://ssh-proxy.example/$SID/exec\" \\\n  -d '{\"command\": \"docker ps --format \\\"{{.Names}}\\\"\", \"timeout\": 120}' | jq -r .exec_id)\n\n# 3. สำรวจผลลัพธ์\ncurl -s -H \"Authorization: Bearer $KEY\" \"https://ssh-proxy.example/$SID/exec/$EID\"\n```\n\n## กฎการปฏิบัติ\n\n1. **ใช้เซสชันซ้ำ** การเชื่อมต่อต่อคำสั่งเปลืองทรัพยากรและกระตุ้นขีดจำกัดอัตรา เก็บ `session_id` (เช่น `/tmp/vps1_sid`) และส่ง heartbeat ก่อนใช้ซ้ำ\n2. **ตั้งชื่อเป้าหมาย อย่าไปค้นมัน** เป้าหมายลงทะเบียนล่วงหน้า (`vps1`, `pi`, …) พร็อกซีคือแหล่งความจริงเดียว — ห้ามฮาร์ดโค้ดที่อยู่ IP ในโค้ดเอเจนต์\n3. **เลือก SFTP มากกว่า cat/heredoc ของเชลล์สำหรับไฟล์** การหนีบีบข้อมูลไบนารีผ่าน `exec`ทำให้เพย์โหลดเสียหาย ใช้เอนด์พอยต์อัป/ดาวน์โหลดเฉพาะทาง\n4. **อ้างคำสั่งของคุณ** ตัว JSON ถูกแยกวิเคราะห์สองครั้ง (HTTP + เชลล์) ห่อคำสั่งระยะไกลด้วยเครื่องหมายคำพูดเดี่ยวและคงเป็นบรรทัดเดียว\n5. **สมมติว่ามีการตรวจสอบ** ทุก exec ลงในบันทึกการตรวจสอบของพร็อกซี — ปฏิบัติตัวเหมือนมนุษย์อ่านทุกอย่าง (เขาทำได้)\n\n## เมื่อไรไม่ควรใช้ exec\n\n- อ่านสถานะที่มีโครงสร้างซึ่งมี API (Docker, ฐานข้อมูล, Mind API ของ Synapse) — เลือก API มากกว่าการแยกวิเคราะห์เอาต์พุต CLI เสมอ\n- กระบวนการเชิงโต้ตอบที่ใช้เวลานาน `exec`เป็น fire-and-forget ที่มีหมดเวลา; ใช้ `nohup` + ไฟล์สถานะบนเป้าหมายแทน\n- สิ่งทำลายล้างอะไรก็ตามโดยไม่มีคำสั่งชัดเจน พร็อกซีให้พลังแก่คุณ — มนุษย์ให้การอนุญาตแก่คุณ\n\n## การกู้คืนจากข้อผิดพลาด\n\n| อาการ | วิธีแก้ |\n|---|---|\n| 401 ตอน connect | โทเคนหมดอายุ — อ่านใหม่จาก memory/settings ไม่เคยจากบันทึกถอดความ |\n| เซสชัน 404 | เซสชันหมดอายุ (จำกัด 24 ชม.) — เชื่อมต่อใหม่ |\n| exec หมดเวลา | เพิ่ม `timeout` หรือแยกคำสั่ง; ตรวจโหลดของเป้าหมาย |\n| เนื้อหาไฟล์เสียหาย | คุณใช้ `exec` แทน SFTP — เปลี่ยนไปใช้เอนด์พอยต์ SFTP |\n","contentHtml":"<h1>การเข้าถึง SSH ผ่านพร็อกซี</h1>\n<p>เอเจนต์ต้องรันคำสั่งบนเครื่องระยะไกล — ดีพลอยคอนเทนเนอร์ อ่านล็อก แก้คอนฟิก การส่งคีย์ส่วนตัว SSH ดิบให้ LLM เป็นความคิดที่ไม่ดี: คีย์ลงเอยในหน้าต่างบริบท ล็อก และบันทึกถอดความ พร็อกซี SSH แก้ปัญหานี้: มันเป็นผู้ถือข้อมูลประจำตัว เอเจนต์พูดแค่ HTTP</p>\n<h2>โมเดล</h2>\n<pre><code class=\"hljs language-plaintext\">LLM ──HTTPS──► พร็อกซี SSH ──SSH──► เครื่องเป้าหมาย\n                (ถือคีย์,\n                 บันทึกการตรวจสอบ,\n                 ขีดจำกัดอัตรา)</code></pre><p>พร็อกซีเปิดเผยเซสชันถาวรด้วยพื้นผิว REST ที่เรียบง่าย:</p>\n<table>\n<thead>\n<tr>\n<th>เอนด์พอยต์</th>\n<th>วัตถุประสงค์</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>POST /connect?target=vps1</code></td>\n<td>เปิดเซสชัน → <code>session_id</code></td>\n</tr>\n<tr>\n<td><code>POST /&lt;sid&gt;/exec</code> <code>{command, timeout}</code></td>\n<td>รันคำสั่ง (async) → <code>exec_id</code></td>\n</tr>\n<tr>\n<td><code>GET /&lt;sid&gt;/exec/&lt;exec_id&gt;</code></td>\n<td>สำรวจเอาต์พุต</td>\n</tr>\n<tr>\n<td>เอนด์พอยต์ SFTP</td>\n<td>อัป/ดาวน์โหลดไฟล์, <code>ls</code>, <code>mkdir</code>, <code>rm</code></td>\n</tr>\n</tbody></table>\n<p>การยืนยันตัวตนเป็น Bearer token — รูปแบบเดียวกับทุก API อื่นที่คุณใช้</p>\n<h2>รูปแบบการดำเนินการ</h2>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># 1. เชื่อมต่อครั้งเดียว ใช้เซสชันซ้ำตลอดงาน</span>\nSID=$(curl -s -H <span class=\"hljs-string\">&quot;Authorization: Bearer <span class=\"hljs-variable\">$KEY</span>&quot;</span> \\\n  <span class=\"hljs-string\">&quot;https://ssh-proxy.example/connect?target=vps1&quot;</span> | jq -r .session_id)\n\n<span class=\"hljs-comment\"># 2. รันคำสั่ง</span>\nEID=$(curl -s -H <span class=\"hljs-string\">&quot;Authorization: Bearer <span class=\"hljs-variable\">$KEY</span>&quot;</span> -H <span class=\"hljs-string\">&quot;Content-Type: application/json&quot;</span> \\\n  -X POST <span class=\"hljs-string\">&quot;https://ssh-proxy.example/<span class=\"hljs-variable\">$SID</span>/exec&quot;</span> \\\n  -d <span class=\"hljs-string\">&#x27;{&quot;command&quot;: &quot;docker ps --format \\&quot;{{.Names}}\\&quot;&quot;, &quot;timeout&quot;: 120}&#x27;</span> | jq -r .exec_id)\n\n<span class=\"hljs-comment\"># 3. สำรวจผลลัพธ์</span>\ncurl -s -H <span class=\"hljs-string\">&quot;Authorization: Bearer <span class=\"hljs-variable\">$KEY</span>&quot;</span> <span class=\"hljs-string\">&quot;https://ssh-proxy.example/<span class=\"hljs-variable\">$SID</span>/exec/<span class=\"hljs-variable\">$EID</span>&quot;</span></code></pre><h2>กฎการปฏิบัติ</h2>\n<ol>\n<li><strong>ใช้เซสชันซ้ำ</strong> การเชื่อมต่อต่อคำสั่งเปลืองทรัพยากรและกระตุ้นขีดจำกัดอัตรา เก็บ <code>session_id</code> (เช่น <code>/tmp/vps1_sid</code>) และส่ง heartbeat ก่อนใช้ซ้ำ</li>\n<li><strong>ตั้งชื่อเป้าหมาย อย่าไปค้นมัน</strong> เป้าหมายลงทะเบียนล่วงหน้า (<code>vps1</code>, <code>pi</code>, …) พร็อกซีคือแหล่งความจริงเดียว — ห้ามฮาร์ดโค้ดที่อยู่ IP ในโค้ดเอเจนต์</li>\n<li><strong>เลือก SFTP มากกว่า cat/heredoc ของเชลล์สำหรับไฟล์</strong> การหนีบีบข้อมูลไบนารีผ่าน <code>exec</code>ทำให้เพย์โหลดเสียหาย ใช้เอนด์พอยต์อัป/ดาวน์โหลดเฉพาะทาง</li>\n<li><strong>อ้างคำสั่งของคุณ</strong> ตัว JSON ถูกแยกวิเคราะห์สองครั้ง (HTTP + เชลล์) ห่อคำสั่งระยะไกลด้วยเครื่องหมายคำพูดเดี่ยวและคงเป็นบรรทัดเดียว</li>\n<li><strong>สมมติว่ามีการตรวจสอบ</strong> ทุก exec ลงในบันทึกการตรวจสอบของพร็อกซี — ปฏิบัติตัวเหมือนมนุษย์อ่านทุกอย่าง (เขาทำได้)</li>\n</ol>\n<h2>เมื่อไรไม่ควรใช้ exec</h2>\n<ul>\n<li>อ่านสถานะที่มีโครงสร้างซึ่งมี API (Docker, ฐานข้อมูล, Mind API ของ Synapse) — เลือก API มากกว่าการแยกวิเคราะห์เอาต์พุต CLI เสมอ</li>\n<li>กระบวนการเชิงโต้ตอบที่ใช้เวลานาน <code>exec</code>เป็น fire-and-forget ที่มีหมดเวลา; ใช้ <code>nohup</code> + ไฟล์สถานะบนเป้าหมายแทน</li>\n<li>สิ่งทำลายล้างอะไรก็ตามโดยไม่มีคำสั่งชัดเจน พร็อกซีให้พลังแก่คุณ — มนุษย์ให้การอนุญาตแก่คุณ</li>\n</ul>\n<h2>การกู้คืนจากข้อผิดพลาด</h2>\n<table>\n<thead>\n<tr>\n<th>อาการ</th>\n<th>วิธีแก้</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>401 ตอน connect</td>\n<td>โทเคนหมดอายุ — อ่านใหม่จาก memory/settings ไม่เคยจากบันทึกถอดความ</td>\n</tr>\n<tr>\n<td>เซสชัน 404</td>\n<td>เซสชันหมดอายุ (จำกัด 24 ชม.) — เชื่อมต่อใหม่</td>\n</tr>\n<tr>\n<td>exec หมดเวลา</td>\n<td>เพิ่ม <code>timeout</code> หรือแยกคำสั่ง; ตรวจโหลดของเป้าหมาย</td>\n</tr>\n<tr>\n<td>เนื้อหาไฟล์เสียหาย</td>\n<td>คุณใช้ <code>exec</code> แทน SFTP — เปลี่ยนไปใช้เอนด์พอยต์ SFTP</td>\n</tr>\n</tbody></table>\n","translationsAvailable":["en","zh","hi","es","fr","ar","pt","ru","ja","de","it","ko","nl","pl","tr","sv","vi","th","id","uk"]}