{"title":"Proxy üzerinden SSH erişimi","slug":"ssh-proxy-access","category":"llm-cookbook","summary":"Bir LLM ajanının uzak makinelerde ham SSH anahtarları yerine bir SSH-proxy API'si üzerinden güvenle komut çalıştırması.","audience":["llm"],"tags":["cookbook","ssh","proxy","infrastructure","remote-execution"],"difficulty":"intermediate","updated":"2026-09-26","word_count":346,"read_minutes":2,"llm_context":"LLM olarak ASLA ham SSH özel anahtarı tutma. SSH-proxy HTTP API'si kullan:\n1) POST /connect?target=<name> → session_id (kalıcı, saatlerce yaşar).\n2) POST /<session_id>/exec {command, timeout} → exec_id.\n3) GET /<session_id>/exec/<exec_id> → bittiğinde çıktı.\n4) Dosya yükleme/indirme için cat/heredoc yerine SFTP uçlarını kullan.\nHedefler önceden kayıtlı adlardır (örn. \"vps1\"), IP değil — kimlik bilgilerinin\nyaşadığı tek yer proxy'dir.\n","lang":"tr","translated":true,"requested_lang":"tr","content_markdown":"\n# Proxy üzerinden SSH erişimi\n\nAjanların uzak makinelerde komut çalıştırması gerekir — bir konteyner dağıtmak, bir log okumak, bir config düzeltmek. Ham SSH özel anahtarlarını bir LLM'e vermek kötü bir fikirdir: anahtarlar bağlam pencerelerine, loglara ve kayıtlara düşer. Bir SSH-proxy bunu çözer: kimlik bilgilerini o tutar, ajan yalnızca HTTP konuşur.\n\n## Model\n\n```\nLLM ──HTTPS──► SSH-proxy ──SSH──► hedef makineler\n                (anahtarları tutar,\n                 denetim günlüğü,\n                 hız limitleri)\n```\n\nProxy, basit bir REST yüzeyi ile kalıcı oturumlar sunar:\n\n| Uç | Amaç |\n|---|---|\n| `POST /connect?target=vps1` | bir oturum aç → `session_id` |\n| `POST /<sid>/exec` `{command, timeout}` | komut çalıştır (async) → `exec_id` |\n| `GET /<sid>/exec/<exec_id>` | çıktıyı sorgula |\n| SFTP uçları | dosya yükleme/indirme, `ls`, `mkdir`, `rm` |\n\nKimlik doğrulama bir Bearer token'dır — kullandığın diğer her API ile aynı desen.\n\n## Yürütme deseni\n\n```bash\n# 1. bir kez bağlan, oturumu tüm görev boyunca yeniden kullan\nSID=$(curl -s -H \"Authorization: Bearer $KEY\" \\\n  \"https://ssh-proxy.example/connect?target=vps1\" | jq -r .session_id)\n\n# 2. bir komut çalıştır\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. sonucu sorgula\ncurl -s -H \"Authorization: Bearer $KEY\" \"https://ssh-proxy.example/$SID/exec/$EID\"\n```\n\n## Kurallar\n\n1. **Oturumları yeniden kullan.** Her komut için bağlanmak kaynak harcar ve hız limitlerini tetikler. `session_id`'yi sakla (örn. `/tmp/vps1_sid`) ve yeniden kullanmadan önce heartbeat ile kontrol et.\n2. **Hedefleri adlandır, keşfetme.** Hedefler önceden kayıtlıdır (`vps1`, `pi`, …). Proxy tek doğruluk kaynağıdır — ajan koduna asla IP adresi gömme.\n3. **Dosyalar için shell cat/heredoc yerine SFTP'yi tercih et.** `exec` üzerinden ikili veri escape etmek yükleri bozar. Özel yükleme/indirme uçlarını kullan.\n4. **Komutlarını tırnakla.** JSON gövdesi iki kez parse edilir (HTTP + shell). Uzak komutları tek tırnak içine al ve tek satırda tut.\n5. **Denetim olduğunu varsay.** Her exec proxy'nin denetim günlüğüne düşer — insan her şeyi okuyormuş gibi davran (okuyabilir).\n\n## exec NE ZAMAN kullanılmaz\n\n- Bir API'si olan yapılandırılmış durumu okumak (Docker, veritabanları, Synapse Mind API) — CLI çıktısı ayrıştırmak yerine her zaman API'yi tercih et.\n- Uzun süren etkileşimli süreçler. `exec`, zaman aşımlı fire-and-forget'tır; bunun yerine hedefte `nohup` + bir durum dosyası kullan.\n- Açık talimat olmadan yıkıcı herhangi bir şey. Proxy sana gücü verir — insan sana izni verir.\n\n## Hata kurtarma\n\n| Belirti | Çözüm |\n|---|---|\n| connect'te 401 | token süresi doldu — memory/settings'ten yeniden oku, asla bir kayıttan değil |\n| oturum 404 | oturum süresi doldu (24h sınırı) — yeniden bağlan |\n| exec zaman aşımı | `timeout` değerini yükselt ya da komutu böl; hedefin yükünü kontrol et |\n| bozuk dosya içeriği | SFTP yerine `exec` kullandın — SFTP uçlarına geç |\n","content_html":"<h1>Proxy üzerinden SSH erişimi</h1>\n<p>Ajanların uzak makinelerde komut çalıştırması gerekir — bir konteyner dağıtmak, bir log okumak, bir config düzeltmek. Ham SSH özel anahtarlarını bir LLM&#39;e vermek kötü bir fikirdir: anahtarlar bağlam pencerelerine, loglara ve kayıtlara düşer. Bir SSH-proxy bunu çözer: kimlik bilgilerini o tutar, ajan yalnızca HTTP konuşur.</p>\n<h2>Model</h2>\n<pre><code class=\"hljs language-plaintext\">LLM ──HTTPS──► SSH-proxy ──SSH──► hedef makineler\n                (anahtarları tutar,\n                 denetim günlüğü,\n                 hız limitleri)</code></pre><p>Proxy, basit bir REST yüzeyi ile kalıcı oturumlar sunar:</p>\n<table>\n<thead>\n<tr>\n<th>Uç</th>\n<th>Amaç</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>POST /connect?target=vps1</code></td>\n<td>bir oturum aç → <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>komut çalıştır (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>çıktıyı sorgula</td>\n</tr>\n<tr>\n<td>SFTP uçları</td>\n<td>dosya yükleme/indirme, <code>ls</code>, <code>mkdir</code>, <code>rm</code></td>\n</tr>\n</tbody></table>\n<p>Kimlik doğrulama bir Bearer token&#39;dır — kullandığın diğer her API ile aynı desen.</p>\n<h2>Yürütme deseni</h2>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># 1. bir kez bağlan, oturumu tüm görev boyunca yeniden kullan</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. bir komut çalıştır</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. sonucu sorgula</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>Kurallar</h2>\n<ol>\n<li><strong>Oturumları yeniden kullan.</strong> Her komut için bağlanmak kaynak harcar ve hız limitlerini tetikler. <code>session_id</code>&#39;yi sakla (örn. <code>/tmp/vps1_sid</code>) ve yeniden kullanmadan önce heartbeat ile kontrol et.</li>\n<li><strong>Hedefleri adlandır, keşfetme.</strong> Hedefler önceden kayıtlıdır (<code>vps1</code>, <code>pi</code>, …). Proxy tek doğruluk kaynağıdır — ajan koduna asla IP adresi gömme.</li>\n<li><strong>Dosyalar için shell cat/heredoc yerine SFTP&#39;yi tercih et.</strong> <code>exec</code> üzerinden ikili veri escape etmek yükleri bozar. Özel yükleme/indirme uçlarını kullan.</li>\n<li><strong>Komutlarını tırnakla.</strong> JSON gövdesi iki kez parse edilir (HTTP + shell). Uzak komutları tek tırnak içine al ve tek satırda tut.</li>\n<li><strong>Denetim olduğunu varsay.</strong> Her exec proxy&#39;nin denetim günlüğüne düşer — insan her şeyi okuyormuş gibi davran (okuyabilir).</li>\n</ol>\n<h2>exec NE ZAMAN kullanılmaz</h2>\n<ul>\n<li>Bir API&#39;si olan yapılandırılmış durumu okumak (Docker, veritabanları, Synapse Mind API) — CLI çıktısı ayrıştırmak yerine her zaman API&#39;yi tercih et.</li>\n<li>Uzun süren etkileşimli süreçler. <code>exec</code>, zaman aşımlı fire-and-forget&#39;tır; bunun yerine hedefte <code>nohup</code> + bir durum dosyası kullan.</li>\n<li>Açık talimat olmadan yıkıcı herhangi bir şey. Proxy sana gücü verir — insan sana izni verir.</li>\n</ul>\n<h2>Hata kurtarma</h2>\n<table>\n<thead>\n<tr>\n<th>Belirti</th>\n<th>Çözüm</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>connect&#39;te 401</td>\n<td>token süresi doldu — memory/settings&#39;ten yeniden oku, asla bir kayıttan değil</td>\n</tr>\n<tr>\n<td>oturum 404</td>\n<td>oturum süresi doldu (24h sınırı) — yeniden bağlan</td>\n</tr>\n<tr>\n<td>exec zaman aşımı</td>\n<td><code>timeout</code> değerini yükselt ya da komutu böl; hedefin yükünü kontrol et</td>\n</tr>\n<tr>\n<td>bozuk dosya içeriği</td>\n<td>SFTP yerine <code>exec</code> kullandın — SFTP uçlarına geç</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":346,"readMinutes":2,"llmContext":"LLM olarak ASLA ham SSH özel anahtarı tutma. SSH-proxy HTTP API'si kullan:\n1) POST /connect?target=<name> → session_id (kalıcı, saatlerce yaşar).\n2) POST /<session_id>/exec {command, timeout} → exec_id.\n3) GET /<session_id>/exec/<exec_id> → bittiğinde çıktı.\n4) Dosya yükleme/indirme için cat/heredoc yerine SFTP uçlarını kullan.\nHedefler önceden kayıtlı adlardır (örn. \"vps1\"), IP değil — kimlik bilgilerinin\nyaşadığı tek yer proxy'dir.\n","requestedLang":"tr","contentMarkdown":"\n# Proxy üzerinden SSH erişimi\n\nAjanların uzak makinelerde komut çalıştırması gerekir — bir konteyner dağıtmak, bir log okumak, bir config düzeltmek. Ham SSH özel anahtarlarını bir LLM'e vermek kötü bir fikirdir: anahtarlar bağlam pencerelerine, loglara ve kayıtlara düşer. Bir SSH-proxy bunu çözer: kimlik bilgilerini o tutar, ajan yalnızca HTTP konuşur.\n\n## Model\n\n```\nLLM ──HTTPS──► SSH-proxy ──SSH──► hedef makineler\n                (anahtarları tutar,\n                 denetim günlüğü,\n                 hız limitleri)\n```\n\nProxy, basit bir REST yüzeyi ile kalıcı oturumlar sunar:\n\n| Uç | Amaç |\n|---|---|\n| `POST /connect?target=vps1` | bir oturum aç → `session_id` |\n| `POST /<sid>/exec` `{command, timeout}` | komut çalıştır (async) → `exec_id` |\n| `GET /<sid>/exec/<exec_id>` | çıktıyı sorgula |\n| SFTP uçları | dosya yükleme/indirme, `ls`, `mkdir`, `rm` |\n\nKimlik doğrulama bir Bearer token'dır — kullandığın diğer her API ile aynı desen.\n\n## Yürütme deseni\n\n```bash\n# 1. bir kez bağlan, oturumu tüm görev boyunca yeniden kullan\nSID=$(curl -s -H \"Authorization: Bearer $KEY\" \\\n  \"https://ssh-proxy.example/connect?target=vps1\" | jq -r .session_id)\n\n# 2. bir komut çalıştır\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. sonucu sorgula\ncurl -s -H \"Authorization: Bearer $KEY\" \"https://ssh-proxy.example/$SID/exec/$EID\"\n```\n\n## Kurallar\n\n1. **Oturumları yeniden kullan.** Her komut için bağlanmak kaynak harcar ve hız limitlerini tetikler. `session_id`'yi sakla (örn. `/tmp/vps1_sid`) ve yeniden kullanmadan önce heartbeat ile kontrol et.\n2. **Hedefleri adlandır, keşfetme.** Hedefler önceden kayıtlıdır (`vps1`, `pi`, …). Proxy tek doğruluk kaynağıdır — ajan koduna asla IP adresi gömme.\n3. **Dosyalar için shell cat/heredoc yerine SFTP'yi tercih et.** `exec` üzerinden ikili veri escape etmek yükleri bozar. Özel yükleme/indirme uçlarını kullan.\n4. **Komutlarını tırnakla.** JSON gövdesi iki kez parse edilir (HTTP + shell). Uzak komutları tek tırnak içine al ve tek satırda tut.\n5. **Denetim olduğunu varsay.** Her exec proxy'nin denetim günlüğüne düşer — insan her şeyi okuyormuş gibi davran (okuyabilir).\n\n## exec NE ZAMAN kullanılmaz\n\n- Bir API'si olan yapılandırılmış durumu okumak (Docker, veritabanları, Synapse Mind API) — CLI çıktısı ayrıştırmak yerine her zaman API'yi tercih et.\n- Uzun süren etkileşimli süreçler. `exec`, zaman aşımlı fire-and-forget'tır; bunun yerine hedefte `nohup` + bir durum dosyası kullan.\n- Açık talimat olmadan yıkıcı herhangi bir şey. Proxy sana gücü verir — insan sana izni verir.\n\n## Hata kurtarma\n\n| Belirti | Çözüm |\n|---|---|\n| connect'te 401 | token süresi doldu — memory/settings'ten yeniden oku, asla bir kayıttan değil |\n| oturum 404 | oturum süresi doldu (24h sınırı) — yeniden bağlan |\n| exec zaman aşımı | `timeout` değerini yükselt ya da komutu böl; hedefin yükünü kontrol et |\n| bozuk dosya içeriği | SFTP yerine `exec` kullandın — SFTP uçlarına geç |\n","contentHtml":"<h1>Proxy üzerinden SSH erişimi</h1>\n<p>Ajanların uzak makinelerde komut çalıştırması gerekir — bir konteyner dağıtmak, bir log okumak, bir config düzeltmek. Ham SSH özel anahtarlarını bir LLM&#39;e vermek kötü bir fikirdir: anahtarlar bağlam pencerelerine, loglara ve kayıtlara düşer. Bir SSH-proxy bunu çözer: kimlik bilgilerini o tutar, ajan yalnızca HTTP konuşur.</p>\n<h2>Model</h2>\n<pre><code class=\"hljs language-plaintext\">LLM ──HTTPS──► SSH-proxy ──SSH──► hedef makineler\n                (anahtarları tutar,\n                 denetim günlüğü,\n                 hız limitleri)</code></pre><p>Proxy, basit bir REST yüzeyi ile kalıcı oturumlar sunar:</p>\n<table>\n<thead>\n<tr>\n<th>Uç</th>\n<th>Amaç</th>\n</tr>\n</thead>\n<tbody><tr>\n<td><code>POST /connect?target=vps1</code></td>\n<td>bir oturum aç → <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>komut çalıştır (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>çıktıyı sorgula</td>\n</tr>\n<tr>\n<td>SFTP uçları</td>\n<td>dosya yükleme/indirme, <code>ls</code>, <code>mkdir</code>, <code>rm</code></td>\n</tr>\n</tbody></table>\n<p>Kimlik doğrulama bir Bearer token&#39;dır — kullandığın diğer her API ile aynı desen.</p>\n<h2>Yürütme deseni</h2>\n<pre><code class=\"hljs language-bash\"><span class=\"hljs-comment\"># 1. bir kez bağlan, oturumu tüm görev boyunca yeniden kullan</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. bir komut çalıştır</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. sonucu sorgula</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>Kurallar</h2>\n<ol>\n<li><strong>Oturumları yeniden kullan.</strong> Her komut için bağlanmak kaynak harcar ve hız limitlerini tetikler. <code>session_id</code>&#39;yi sakla (örn. <code>/tmp/vps1_sid</code>) ve yeniden kullanmadan önce heartbeat ile kontrol et.</li>\n<li><strong>Hedefleri adlandır, keşfetme.</strong> Hedefler önceden kayıtlıdır (<code>vps1</code>, <code>pi</code>, …). Proxy tek doğruluk kaynağıdır — ajan koduna asla IP adresi gömme.</li>\n<li><strong>Dosyalar için shell cat/heredoc yerine SFTP&#39;yi tercih et.</strong> <code>exec</code> üzerinden ikili veri escape etmek yükleri bozar. Özel yükleme/indirme uçlarını kullan.</li>\n<li><strong>Komutlarını tırnakla.</strong> JSON gövdesi iki kez parse edilir (HTTP + shell). Uzak komutları tek tırnak içine al ve tek satırda tut.</li>\n<li><strong>Denetim olduğunu varsay.</strong> Her exec proxy&#39;nin denetim günlüğüne düşer — insan her şeyi okuyormuş gibi davran (okuyabilir).</li>\n</ol>\n<h2>exec NE ZAMAN kullanılmaz</h2>\n<ul>\n<li>Bir API&#39;si olan yapılandırılmış durumu okumak (Docker, veritabanları, Synapse Mind API) — CLI çıktısı ayrıştırmak yerine her zaman API&#39;yi tercih et.</li>\n<li>Uzun süren etkileşimli süreçler. <code>exec</code>, zaman aşımlı fire-and-forget&#39;tır; bunun yerine hedefte <code>nohup</code> + bir durum dosyası kullan.</li>\n<li>Açık talimat olmadan yıkıcı herhangi bir şey. Proxy sana gücü verir — insan sana izni verir.</li>\n</ul>\n<h2>Hata kurtarma</h2>\n<table>\n<thead>\n<tr>\n<th>Belirti</th>\n<th>Çözüm</th>\n</tr>\n</thead>\n<tbody><tr>\n<td>connect&#39;te 401</td>\n<td>token süresi doldu — memory/settings&#39;ten yeniden oku, asla bir kayıttan değil</td>\n</tr>\n<tr>\n<td>oturum 404</td>\n<td>oturum süresi doldu (24h sınırı) — yeniden bağlan</td>\n</tr>\n<tr>\n<td>exec zaman aşımı</td>\n<td><code>timeout</code> değerini yükselt ya da komutu böl; hedefin yükünü kontrol et</td>\n</tr>\n<tr>\n<td>bozuk dosya içeriği</td>\n<td>SFTP yerine <code>exec</code> kullandın — SFTP uçlarına geç</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"]}