{"title":"Truy cập SSH qua proxy","slug":"ssh-proxy-access","category":"llm-cookbook","summary":"Tác nhân LLM chạy lệnh trên máy từ xa an toàn qua API proxy SSH thay vì khóa SSH thô như thế nào.","audience":["llm"],"tags":["cookbook","ssh","proxy","infrastructure","remote-execution"],"difficulty":"intermediate","updated":"2026-09-26","word_count":451,"read_minutes":2,"llm_context":"KHÔNG BAO GIỜ giữ khóa riêng SSH thô với tư cách LLM. Dùng HTTP API proxy SSH:\n1) POST /connect?target=<name> → session_id (bền vững, sống qua hàng giờ).\n2) POST /<session_id>/exec {command, timeout} → exec_id.\n3) GET /<session_id>/exec/<exec_id> → đầu ra khi xong.\n4) Dùng endpoint SFTP cho tải lên/xuống tệp thay vì cat/heredoc.\nMục tiêu là tên đăng ký trước (vd. \"vps1\"), không phải IP — proxy là nơi duy\nnhất chứa thông tin xác thực.\n","lang":"vi","translated":true,"requested_lang":"vi","content_markdown":"\n# Truy cập SSH qua proxy\n\nTác nhân cần chạy lệnh trên máy từ xa — triển khai container, đọc log, sửa cấu hình. Giao khóa riêng SSH thô cho LLM là ý tồi: khóa lọt vào cửa sổ ngữ cảnh, log và bản ghi. Proxy SSH giải quyết điều này: nó giữ thông tin xác thực, tác nhân chỉ nói HTTP.\n\n## Mô hình\n\n```\nLLM ──HTTPS──► Proxy SSH ──SSH──► máy đích\n                (giữ khóa,\n                 nhật ký kiểm toán,\n                 giới hạn tần suất)\n```\n\nProxy cung cấp phiên bền vững qua mặt REST đơn giản:\n\n| Endpoint | Mục đích |\n|---|---|\n| `POST /connect?target=vps1` | mở phiên → `session_id` |\n| `POST /<sid>/exec` `{command, timeout}` | chạy lệnh (async) → `exec_id` |\n| `GET /<sid>/exec/<exec_id>` | thăm dò đầu ra |\n| Endpoint SFTP | tải lên/xuống tệp, `ls`, `mkdir`, `rm` |\n\nXác thực là token Bearer — cùng mẫu với mọi API khác bạn dùng.\n\n## Mẫu thực thi\n\n```bash\n# 1. kết nối một lần, tái sử dụng phiên cho cả tác vụ\nSID=$(curl -s -H \"Authorization: Bearer $KEY\" \\\n  \"https://ssh-proxy.example/connect?target=vps1\" | jq -r .session_id)\n\n# 2. chạy một lệnh\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. thăm dò kết quả\ncurl -s -H \"Authorization: Bearer $KEY\" \"https://ssh-proxy.example/$SID/exec/$EID\"\n```\n\n## Quy tắc thao tác\n\n1. **Tái sử dụng phiên.** Kết nối cho từng lệnh lãng phí tài nguyên và đụng giới hạn tần suất. Lưu `session_id` (vd. `/tmp/vps1_sid`) và gửi heartbeat trước khi tái dùng.\n2. **Đặt tên mục tiêu, đừng dò tìm.** Mục tiêu được đăng ký trước (`vps1`, `pi`, …). Proxy là nguồn chân lý duy nhất — không bao giờ mã hóa cứng địa chỉ IP vào mã tác nhân.\n3. **Ưu tiên SFTP hơn cat/heredoc của shell cho tệp.** Escape dữ liệu nhị phân qua `exec` làm hỏng tải trọng. Dùng endpoint tải lên/xuống chuyên dụng.\n4. **Bọc lệnh của bạn trong dấu ngoặc.** Thân JSON được phân tích hai lần (HTTP + shell). Bọc lệnh từ xa trong ngoặc đơn và giữ một dòng.\n5. **Giả định có kiểm toán.** Mỗi lệnh exec vào nhật ký kiểm toán của proxy — hành xử như con người đọc mọi thứ (họ có thể).\n\n## Khi nào KHÔNG dùng exec\n\n- Đọc trạng thái có cấu trúc đã có API (Docker, cơ sở dữ liệu, Mind API của Synapse) — luôn ưu tiên API hơn phân tích đầu ra CLI.\n- Tiến trình tương tác dài hạn. `exec` là fire-and-forget có thời hạn; thay vào đó dùng `nohup` + tệp trạng thái trên máy đích.\n- Bất kỳ điều gì phá hoại mà không có chỉ thị rõ ràng. Proxy cho bạn quyền lực — con người cho bạn sự cho phép.\n\n## Khôi phục lỗi\n\n| Triệu chứng | Cách xử lý |\n|---|---|\n| 401 khi connect | token hết hạn — đọc lại từ memory/settings, không bao giờ từ bản ghi |\n| phiên 404 | phiên hết hạn (trần 24h) — kết nối lại |\n| exec quá hạn | tăng `timeout` hoặc chia nhỏ lệnh; kiểm tra tải máy đích |\n| nội dung tệp hỏng | bạn dùng `exec` thay vì SFTP — chuyển sang endpoint SFTP |\n","content_html":"<h1>Truy cập SSH qua proxy</h1>\n<p>Tác nhân cần chạy lệnh trên máy từ xa — triển khai container, đọc log, sửa cấu hình. Giao khóa riêng SSH thô cho LLM là ý tồi: khóa lọt vào cửa sổ ngữ cảnh, log và bản ghi. Proxy SSH giải quyết điều này: nó giữ thông tin xác thực, tác nhân chỉ nói HTTP.</p>\n<h2>Mô hình</h2>\n<pre><code class=\"hljs language-plaintext\">LLM ──HTTPS──► Proxy SSH ──SSH──► máy đích\n                (giữ khóa,\n                 nhật ký kiểm toán,\n                 giới hạn tần suất)</code></pre><p>Proxy cung cấp phiên bền vững qua mặt REST đơn giản:</p>\n<table>\n<thead>\n<tr>\n<th>Endpoint</th>\n<th>Mục đích</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>POST /connect?target=vps1</code></td>\n<td>mở phiên → <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>chạy lệnh (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>thăm dò đầu ra</td>\n</tr>\n<tr>\n<td>Endpoint SFTP</td>\n<td>tải lên/xuống tệp, <code>ls</code>, <code>mkdir</code>, <code>rm</code></td>\n</tr>\n</tbody></table>\n<p>Xác thực là token Bearer — cùng mẫu với mọi API khác bạn dùng.</p>\n<h2>Mẫu thực thi</h2>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># 1. kết nối một lần, tái sử dụng phiên cho cả tác vụ</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. chạy một lệnh</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. thăm dò kết quả</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>Quy tắc thao tác</h2>\n<ol>\n<li><strong>Tái sử dụng phiên.</strong> Kết nối cho từng lệnh lãng phí tài nguyên và đụng giới hạn tần suất. Lưu <code>session_id</code> (vd. <code>/tmp/vps1_sid</code>) và gửi heartbeat trước khi tái dùng.</li>\n<li><strong>Đặt tên mục tiêu, đừng dò tìm.</strong> Mục tiêu được đăng ký trước (<code>vps1</code>, <code>pi</code>, …). Proxy là nguồn chân lý duy nhất — không bao giờ mã hóa cứng địa chỉ IP vào mã tác nhân.</li>\n<li><strong>Ưu tiên SFTP hơn cat/heredoc của shell cho tệp.</strong> Escape dữ liệu nhị phân qua <code>exec</code> làm hỏng tải trọng. Dùng endpoint tải lên/xuống chuyên dụng.</li>\n<li><strong>Bọc lệnh của bạn trong dấu ngoặc.</strong> Thân JSON được phân tích hai lần (HTTP + shell). Bọc lệnh từ xa trong ngoặc đơn và giữ một dòng.</li>\n<li><strong>Giả định có kiểm toán.</strong> Mỗi lệnh exec vào nhật ký kiểm toán của proxy — hành xử như con người đọc mọi thứ (họ có thể).</li>\n</ol>\n<h2>Khi nào KHÔNG dùng exec</h2>\n<ul>\n<li>Đọc trạng thái có cấu trúc đã có API (Docker, cơ sở dữ liệu, Mind API của Synapse) — luôn ưu tiên API hơn phân tích đầu ra CLI.</li>\n<li>Tiến trình tương tác dài hạn. <code>exec</code> là fire-and-forget có thời hạn; thay vào đó dùng <code>nohup</code> + tệp trạng thái trên máy đích.</li>\n<li>Bất kỳ điều gì phá hoại mà không có chỉ thị rõ ràng. Proxy cho bạn quyền lực — con người cho bạn sự cho phép.</li>\n</ul>\n<h2>Khôi phục lỗi</h2>\n<table>\n<thead>\n<tr>\n<th>Triệu chứng</th>\n<th>Cách xử lý</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>401 khi connect</td>\n<td>token hết hạn — đọc lại từ memory/settings, không bao giờ từ bản ghi</td>\n</tr>\n<tr>\n<td>phiên 404</td>\n<td>phiên hết hạn (trần 24h) — kết nối lại</td>\n</tr>\n<tr>\n<td>exec quá hạn</td>\n<td>tăng <code>timeout</code> hoặc chia nhỏ lệnh; kiểm tra tải máy đích</td>\n</tr>\n<tr>\n<td>nội dung tệp hỏng</td>\n<td>bạn dùng <code>exec</code> thay vì SFTP — chuyển sang endpoint 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":451,"readMinutes":2,"llmContext":"KHÔNG BAO GIỜ giữ khóa riêng SSH thô với tư cách LLM. Dùng HTTP API proxy SSH:\n1) POST /connect?target=<name> → session_id (bền vững, sống qua hàng giờ).\n2) POST /<session_id>/exec {command, timeout} → exec_id.\n3) GET /<session_id>/exec/<exec_id> → đầu ra khi xong.\n4) Dùng endpoint SFTP cho tải lên/xuống tệp thay vì cat/heredoc.\nMục tiêu là tên đăng ký trước (vd. \"vps1\"), không phải IP — proxy là nơi duy\nnhất chứa thông tin xác thực.\n","requestedLang":"vi","contentMarkdown":"\n# Truy cập SSH qua proxy\n\nTác nhân cần chạy lệnh trên máy từ xa — triển khai container, đọc log, sửa cấu hình. Giao khóa riêng SSH thô cho LLM là ý tồi: khóa lọt vào cửa sổ ngữ cảnh, log và bản ghi. Proxy SSH giải quyết điều này: nó giữ thông tin xác thực, tác nhân chỉ nói HTTP.\n\n## Mô hình\n\n```\nLLM ──HTTPS──► Proxy SSH ──SSH──► máy đích\n                (giữ khóa,\n                 nhật ký kiểm toán,\n                 giới hạn tần suất)\n```\n\nProxy cung cấp phiên bền vững qua mặt REST đơn giản:\n\n| Endpoint | Mục đích |\n|---|---|\n| `POST /connect?target=vps1` | mở phiên → `session_id` |\n| `POST /<sid>/exec` `{command, timeout}` | chạy lệnh (async) → `exec_id` |\n| `GET /<sid>/exec/<exec_id>` | thăm dò đầu ra |\n| Endpoint SFTP | tải lên/xuống tệp, `ls`, `mkdir`, `rm` |\n\nXác thực là token Bearer — cùng mẫu với mọi API khác bạn dùng.\n\n## Mẫu thực thi\n\n```bash\n# 1. kết nối một lần, tái sử dụng phiên cho cả tác vụ\nSID=$(curl -s -H \"Authorization: Bearer $KEY\" \\\n  \"https://ssh-proxy.example/connect?target=vps1\" | jq -r .session_id)\n\n# 2. chạy một lệnh\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. thăm dò kết quả\ncurl -s -H \"Authorization: Bearer $KEY\" \"https://ssh-proxy.example/$SID/exec/$EID\"\n```\n\n## Quy tắc thao tác\n\n1. **Tái sử dụng phiên.** Kết nối cho từng lệnh lãng phí tài nguyên và đụng giới hạn tần suất. Lưu `session_id` (vd. `/tmp/vps1_sid`) và gửi heartbeat trước khi tái dùng.\n2. **Đặt tên mục tiêu, đừng dò tìm.** Mục tiêu được đăng ký trước (`vps1`, `pi`, …). Proxy là nguồn chân lý duy nhất — không bao giờ mã hóa cứng địa chỉ IP vào mã tác nhân.\n3. **Ưu tiên SFTP hơn cat/heredoc của shell cho tệp.** Escape dữ liệu nhị phân qua `exec` làm hỏng tải trọng. Dùng endpoint tải lên/xuống chuyên dụng.\n4. **Bọc lệnh của bạn trong dấu ngoặc.** Thân JSON được phân tích hai lần (HTTP + shell). Bọc lệnh từ xa trong ngoặc đơn và giữ một dòng.\n5. **Giả định có kiểm toán.** Mỗi lệnh exec vào nhật ký kiểm toán của proxy — hành xử như con người đọc mọi thứ (họ có thể).\n\n## Khi nào KHÔNG dùng exec\n\n- Đọc trạng thái có cấu trúc đã có API (Docker, cơ sở dữ liệu, Mind API của Synapse) — luôn ưu tiên API hơn phân tích đầu ra CLI.\n- Tiến trình tương tác dài hạn. `exec` là fire-and-forget có thời hạn; thay vào đó dùng `nohup` + tệp trạng thái trên máy đích.\n- Bất kỳ điều gì phá hoại mà không có chỉ thị rõ ràng. Proxy cho bạn quyền lực — con người cho bạn sự cho phép.\n\n## Khôi phục lỗi\n\n| Triệu chứng | Cách xử lý |\n|---|---|\n| 401 khi connect | token hết hạn — đọc lại từ memory/settings, không bao giờ từ bản ghi |\n| phiên 404 | phiên hết hạn (trần 24h) — kết nối lại |\n| exec quá hạn | tăng `timeout` hoặc chia nhỏ lệnh; kiểm tra tải máy đích |\n| nội dung tệp hỏng | bạn dùng `exec` thay vì SFTP — chuyển sang endpoint SFTP |\n","contentHtml":"<h1>Truy cập SSH qua proxy</h1>\n<p>Tác nhân cần chạy lệnh trên máy từ xa — triển khai container, đọc log, sửa cấu hình. Giao khóa riêng SSH thô cho LLM là ý tồi: khóa lọt vào cửa sổ ngữ cảnh, log và bản ghi. Proxy SSH giải quyết điều này: nó giữ thông tin xác thực, tác nhân chỉ nói HTTP.</p>\n<h2>Mô hình</h2>\n<pre><code class=\"hljs language-plaintext\">LLM ──HTTPS──► Proxy SSH ──SSH──► máy đích\n                (giữ khóa,\n                 nhật ký kiểm toán,\n                 giới hạn tần suất)</code></pre><p>Proxy cung cấp phiên bền vững qua mặt REST đơn giản:</p>\n<table>\n<thead>\n<tr>\n<th>Endpoint</th>\n<th>Mục đích</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>POST /connect?target=vps1</code></td>\n<td>mở phiên → <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>chạy lệnh (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>thăm dò đầu ra</td>\n</tr>\n<tr>\n<td>Endpoint SFTP</td>\n<td>tải lên/xuống tệp, <code>ls</code>, <code>mkdir</code>, <code>rm</code></td>\n</tr>\n</tbody></table>\n<p>Xác thực là token Bearer — cùng mẫu với mọi API khác bạn dùng.</p>\n<h2>Mẫu thực thi</h2>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># 1. kết nối một lần, tái sử dụng phiên cho cả tác vụ</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. chạy một lệnh</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. thăm dò kết quả</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>Quy tắc thao tác</h2>\n<ol>\n<li><strong>Tái sử dụng phiên.</strong> Kết nối cho từng lệnh lãng phí tài nguyên và đụng giới hạn tần suất. Lưu <code>session_id</code> (vd. <code>/tmp/vps1_sid</code>) và gửi heartbeat trước khi tái dùng.</li>\n<li><strong>Đặt tên mục tiêu, đừng dò tìm.</strong> Mục tiêu được đăng ký trước (<code>vps1</code>, <code>pi</code>, …). Proxy là nguồn chân lý duy nhất — không bao giờ mã hóa cứng địa chỉ IP vào mã tác nhân.</li>\n<li><strong>Ưu tiên SFTP hơn cat/heredoc của shell cho tệp.</strong> Escape dữ liệu nhị phân qua <code>exec</code> làm hỏng tải trọng. Dùng endpoint tải lên/xuống chuyên dụng.</li>\n<li><strong>Bọc lệnh của bạn trong dấu ngoặc.</strong> Thân JSON được phân tích hai lần (HTTP + shell). Bọc lệnh từ xa trong ngoặc đơn và giữ một dòng.</li>\n<li><strong>Giả định có kiểm toán.</strong> Mỗi lệnh exec vào nhật ký kiểm toán của proxy — hành xử như con người đọc mọi thứ (họ có thể).</li>\n</ol>\n<h2>Khi nào KHÔNG dùng exec</h2>\n<ul>\n<li>Đọc trạng thái có cấu trúc đã có API (Docker, cơ sở dữ liệu, Mind API của Synapse) — luôn ưu tiên API hơn phân tích đầu ra CLI.</li>\n<li>Tiến trình tương tác dài hạn. <code>exec</code> là fire-and-forget có thời hạn; thay vào đó dùng <code>nohup</code> + tệp trạng thái trên máy đích.</li>\n<li>Bất kỳ điều gì phá hoại mà không có chỉ thị rõ ràng. Proxy cho bạn quyền lực — con người cho bạn sự cho phép.</li>\n</ul>\n<h2>Khôi phục lỗi</h2>\n<table>\n<thead>\n<tr>\n<th>Triệu chứng</th>\n<th>Cách xử lý</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>401 khi connect</td>\n<td>token hết hạn — đọc lại từ memory/settings, không bao giờ từ bản ghi</td>\n</tr>\n<tr>\n<td>phiên 404</td>\n<td>phiên hết hạn (trần 24h) — kết nối lại</td>\n</tr>\n<tr>\n<td>exec quá hạn</td>\n<td>tăng <code>timeout</code> hoặc chia nhỏ lệnh; kiểm tra tải máy đích</td>\n</tr>\n<tr>\n<td>nội dung tệp hỏng</td>\n<td>bạn dùng <code>exec</code> thay vì SFTP — chuyển sang endpoint 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"]}