ssh-mcp
by aposadm
README.md
# ssh-mcp
MCP server ที่เปิดให้ Claude (หรือ MCP client อื่น) สั่งงานเครื่องปลายทางผ่าน SSH ได้ —
รันคำสั่ง, อ่าน/เขียนไฟล์, โอนไฟล์ SFTP และเปิด shell แบบ interactive
กำหนดหลายโฮสต์ผ่านไฟล์ `.env` ยืนยันตัวตนด้วย username/password
## ความสามารถ (Tools)
| Tool | หน้าที่ |
|------|--------|
| `ssh_list_hosts` | แสดงรายชื่อโฮสต์ที่ตั้งค่าไว้ (ไม่คืน password) |
| `ssh_exec` | รันคำสั่ง คืน stdout / stderr / exit_status |
| `ssh_read_file` | อ่านไฟล์ปลายทางผ่าน SFTP |
| `ssh_write_file` | เขียน/สร้างไฟล์ปลายทางผ่าน SFTP |
| `ssh_list_dir` | แสดงรายการไฟล์ในไดเรกทอรีปลายทาง |
| `ssh_upload` | อัปโหลดไฟล์ในเครื่อง → ปลายทาง |
| `ssh_download` | ดาวน์โหลดไฟล์ปลายทาง → เครื่องนี้ |
| `ssh_session_open` | เปิด interactive shell คืน `session_id` |
| `ssh_session_send` | ส่งข้อความ/คำสั่งเข้าเซสชัน แล้วคืน output |
| `ssh_session_read` | อ่าน output ที่ค้างในเซสชัน |
| `ssh_session_close` | ปิดเซสชัน |
| `ssh_list_sessions` | แสดงเซสชันที่เปิดอยู่ |
## ติดตั้ง
```bash
pip install -r requirements.txt
# หรือแบบ editable พร้อม console script `ssh-mcp`
pip install -e .
```
## ตั้งค่า
คัดลอก `.env.example` → `.env` แล้วแก้ค่าโฮสต์จริง แต่ละโฮสต์เป็น "profile" ตามรูปแบบ prefix:
```dotenv
SSH_PROFILES=prod,staging
SSH_PROD_HOST=10.0.0.1
SSH_PROD_PORT=22
SSH_PROD_USER=root
SSH_PROD_PASSWORD=secret
SSH_STAGING_HOST=10.0.0.2
SSH_STAGING_USER=deploy
SSH_STAGING_PASSWORD=secret
```
- ชื่อ profile (ตัวพิมพ์เล็ก เช่น `prod`, `staging`) คือค่าที่ส่งเป็น argument `host` ของแต่ละ tool
- `SSH_PROFILES` ระบุ/จัดลำดับ profile ที่จะเปิดใช้ ถ้าเว้นว่างจะ auto-detect จาก `SSH_*_HOST` ทั้งหมด
- Global options: `SSH_CONNECT_TIMEOUT`, `SSH_COMMAND_TIMEOUT`, `SSH_KNOWN_HOSTS_POLICY` (`auto_add` | `reject`)
> **ความปลอดภัย:** `.env` อยู่ใน `.gitignore` อยู่แล้ว อย่า commit ค่าจริง
> สำหรับ production แนะนำตั้ง `SSH_KNOWN_HOSTS_POLICY=reject` (โฮสต์ต้องอยู่ใน `~/.ssh/known_hosts`)
## รัน
```bash
python -m ssh_mcp.server # stdio transport
# หรือ (หลัง pip install -e .)
ssh-mcp
```
## เชื่อมกับ Claude Code / Claude Desktop
เพิ่มเข้าไฟล์ config MCP:
```json
{
"mcpServers": {
"ssh": {
"command": "python",
"args": ["-m", "ssh_mcp.server"],
"cwd": "d:\\AI\\apos"
}
}
}
```
## ทดสอบด้วย MCP Inspector
```bash
npx @modelcontextprotocol/inspector python -m ssh_mcp.server
```
แล้วลองเรียก `ssh_list_hosts` → `ssh_exec` (เช่น `whoami`) → วงจร `ssh_session_open` / `ssh_session_send` / `ssh_session_close`
## ตัวอย่างการใช้ interactive session
1. `ssh_session_open(host="prod")` → ได้ `session_id`
2. `ssh_session_send(session_id, data="top\n")` → คืน output รอบแรก
3. `ssh_session_send(session_id, data="q")` เพื่อออกจาก top
4. `ssh_session_close(session_id)`
> หมายเหตุ: `ssh_session_send` ไม่เติม newline ให้อัตโนมัติ — ต้องใส่ `\n` เองเมื่อต้องการกด enter
This server cannot be deployed
Maintenance
ActivitySlowing
ResponsivenessNo issues