DEV Community

Cover image for SSH Remote Terminal ใน Garudust Agent — ให้ AI สั่งงานบน Server จริงได้เลย
Garudust
Garudust

Posted on

SSH Remote Terminal ใน Garudust Agent — ให้ AI สั่งงานบน Server จริงได้เลย

ก่อนหน้านี้ Garudust Agent รัน terminal tool ได้สองแบบ — บนเครื่อง local โดยตรง หรือ wrap ผ่าน Docker container เพื่อ isolation

v0.13 เพิ่ม SSH sandbox — แบบที่สาม ที่ส่งทุก command ผ่าน ssh ไปรันบน remote host แทน

security:
  terminal_sandbox: ssh
  ssh_host: "build.example.com"
  ssh_user: "deploy"
  ssh_port: 22
  ssh_key_path: ~/.ssh/deploy_key
Enter fullscreen mode Exit fullscreen mode

ไม่ต้องแก้โค้ด ไม่ต้องเพิ่ม dependency — ใช้ ssh binary ที่มีอยู่แล้ว


ทำไมถึงมีประโยชน์?

ปัญหาของ terminal_sandbox: none และ docker คือทั้งคู่รันบนเครื่องที่ garudust อยู่เท่านั้น ถ้า agent อยู่บน laptop แต่อยากให้มันจัดการ production server — ก็ทำไม่ได้

SSH sandbox แก้ปัญหานี้ตรงๆ


Use Case 1 — Build & Deploy บน Remote Server

สมมติมี build server แยกต่างหาก ไม่อยากให้ laptop ต้อง build เอง:

security:
  terminal_sandbox: ssh
  ssh_host: "build.internal.example.com"
  ssh_user: "ci"
  ssh_key_path: ~/.ssh/ci_key
Enter fullscreen mode Exit fullscreen mode

แล้วคุยกับ agent ได้เลย:

"build release และ deploy ไปที่ /opt/app"
Enter fullscreen mode Exit fullscreen mode

Agent จะรัน:

  1. cargo build --release — บน build server
  2. systemctl restart myapp — บน build server

เครื่อง local ไม่ต้องมี Rust, ไม่ต้องมี prod credentials ไม่มีอะไรรั่วออกมา


Use Case 2 — Ops Assistant จาก Telegram

ผูก Garudust เข้า Telegram แล้วถามสุขภาพ server ได้ตลอดเวลา:

คุณ: disk เต็มไหม
Agent: ✓ terminal: df -h /
       / → 23% used (226 GB / 981 GB)
       ปกติดีครับ

คุณ: process ที่กิน RAM มากสุด 5 อันดับ
Agent: ✓ terminal: ps aux --sort=-%mem | head -6
       1. postgres   12.3%
       2. node       8.1%
       ...
Enter fullscreen mode Exit fullscreen mode

ทุก command ผ่าน hardline check + approval gate ก่อนเสมอ — ไม่มีทางที่ prompt injection จะสั่ง rm -rf ได้


Use Case 3 — ควบคุม Raspberry Pi ผ่าน LINE

Pi อยู่ใน home network ไม่ได้ expose port ออกอินเทอร์เน็ต ให้ garudust-server อยู่บน Pi เดียวกันหรือเครื่องในวง LAN แล้วรับคำสั่งจาก LINE:

security:
  terminal_sandbox: ssh
  ssh_host: "192.168.1.50"   # Pi อยู่ใน LAN
  ssh_user: "pi"
Enter fullscreen mode Exit fullscreen mode
"เปิดสปริงเกลอร์ 5 นาที"
→ terminal: python3 ~/scripts/sprinkler.py on 300

"อุณหภูมิตอนนี้เท่าไหร่"
→ terminal: cat /sys/bus/w1/devices/28-*/w1_slave | grep t= | awk -F= '{printf "%.1f°C\n", $2/1000}'
Enter fullscreen mode Exit fullscreen mode

สั่งงานผ่าน LINE ได้เหมือน SSH เข้าไปเอง แต่ไม่ต้องเปิด terminal


Use Case 4 — Isolated Environment โดยไม่ใช้ Docker

บางเครื่อง Docker ไม่ available (ARM SBC, embedded, VPS ราคาถูก) แต่อยากได้ isolation — ใช้ VM หรือ LXC container ที่มี SSH แทน:

laptop (garudust) → SSH → sandbox VM → รัน untrusted code
Enter fullscreen mode Exit fullscreen mode

ถ้า agent ทำอะไรผิดพลาด snapshot VM กลับมาได้ทันที โดยที่ local filesystem ไม่โดนแตะเลย


Security ที่ได้มาโดยอัตโนมัติ

SSH sandbox ไม่ได้แค่ส่ง command ไป remote — มี hardening ติดมาด้วยทุกครั้ง:

Property วิธีทำ
ไม่มี interactive prompt BatchMode=yes — fail ทันทีถ้า key auth ล้มเหลว
ป้องกัน MITM StrictHostKeyChecking=accept-new — เชื่อ host แรก, ปฏิเสธถ้า key เปลี่ยน
Connection timeout ConnectTimeout=min(timeout, 30) — ไม่แขวน process
ป้องกัน flag injection -- ก่อน command เสมอ — command ที่ขึ้นต้นด้วย - ไม่ถูกตีความเป็น ssh flag
Secrets ไม่รั่ว env_clear() ก่อน spawn ssh — API key ไม่ถึง remote host

ลองได้เลย — ไม่ต้องมี server จริง

# 1. สร้าง SSH key สำหรับทดสอบ
ssh-keygen -t ed25519 -f /tmp/test_key -N ""

# 2. รัน SSH container
PUBKEY=$(cat /tmp/test_key.pub)
docker build -t sshd-test - << 'EOF'
FROM ubuntu:24.04
RUN apt-get update -qq && apt-get install -y openssh-server \
    && useradd -m testuser && mkdir -p /home/testuser/.ssh /var/run/sshd
ARG PUBKEY
RUN echo "$PUBKEY" > /home/testuser/.ssh/authorized_keys \
    && chmod 700 /home/testuser/.ssh \
    && chmod 600 /home/testuser/.ssh/authorized_keys \
    && chown -R testuser:testuser /home/testuser/.ssh \
    && ssh-keygen -A
EXPOSE 22
CMD ["/usr/sbin/sshd", "-D"]
EOF
docker run -d --name sshd-test -p 2222:22 --build-arg PUBKEY="$PUBKEY" sshd-test

# 3. ทดสอบกับ garudust
GARUDUST_TERMINAL_SANDBOX=ssh \
GARUDUST_SSH_HOST=127.0.0.1 \
GARUDUST_SSH_USER=testuser \
GARUDUST_SSH_PORT=2222 \
GARUDUST_SSH_KEY_PATH=/tmp/test_key \
GARUDUST_APPROVAL_MODE=auto \
  garudust "บอก OS version, จำนวน CPU และ memory บน remote host"
Enter fullscreen mode Exit fullscreen mode

ผลที่ได้ (จาก container):

- ระบบปฏิบัติการ: Ubuntu 24.04.4 LTS (Noble Numbat)
- จำนวน CPU: 14 แกน
- หน่วยความจำ: 7.7 GiB (ใช้ไป 544 MiB, ว่าง 6.7 GiB)
Enter fullscreen mode Exit fullscreen mode

hostname คืน container ID → ยืนยันว่า command รันบน remote จริง ไม่ใช่ local


สรุป

Mode เหมาะกับ
none dev machine, ทดสอบ, low-risk tasks
docker production local, untrusted code, ต้องการ filesystem isolation
ssh remote server, IoT/Pi, build farm, VM sandbox, ไม่มี Docker

ติดตั้งจาก GitHub Releases หรือ:

cargo install garudust
Enter fullscreen mode Exit fullscreen mode

Source: garudust-org/garudust-agent

Top comments (0)