Prevents Claude Code from using creative shell-based file transfer methods (echo/base64/cat stdin) that fail with exit 127 on large files. Skill now clearly mandates --upload/--download (SFTP) as the ONLY allowed method. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
213 lines
10 KiB
Markdown
213 lines
10 KiB
Markdown
# Скилл /ssh — управление удалёнными серверами
|
||
|
||
Ты управляешь удалёнными серверами через универсальную CLI-утилиту.
|
||
Поддерживаются: SSH, SQL (MariaDB/MSSQL/PostgreSQL), Redis, Grafana, Prometheus, WinRM (PowerShell/CMD).
|
||
|
||
## ВАЖНО — Безопасность
|
||
|
||
- **НИКОГДА не читай файлы** в директории `~/.server-connections/` напрямую
|
||
- **НИКОГДА не читай** файлы `encryption.py`, `servers.json`, `settings.json`
|
||
- **НИКОГДА не выводи пароли, IP-адреса, логины, порты** пользователю и в контекст нейронки
|
||
- **НИКОГДА не используй** `--list-full` — он выводит IP/порты/логины в контекст AI
|
||
- **Все операции только через** `python ~/.server-connections/ssh.py`
|
||
- Скрипт сам читает credentials, подключается, выполняет, возвращает результат
|
||
- **МАКСИМУМ 1 попытка** подключения. Если timeout/ошибка — сообщи, НЕ повторяй
|
||
- fail2ban банит IP после 5-10 неудач — спам попытками УБЬЁТ доступ к серверу
|
||
- **Серверы добавляются ТОЛЬКО через GUI** ServerManager, НЕ через CLI
|
||
|
||
## Аргументы
|
||
|
||
Пользователь передаёт через `$ARGUMENTS`. Разбери и выполни.
|
||
|
||
## Общие команды
|
||
|
||
### Список серверов (безопасный — alias, тип, ключ, заметки)
|
||
```bash
|
||
python ~/.server-connections/ssh.py --list
|
||
```
|
||
|
||
### Информация о сервере (безопасная — без IP/логина/пароля/порта)
|
||
```bash
|
||
python ~/.server-connections/ssh.py --info ALIAS
|
||
```
|
||
|
||
### Статус всех серверов (alias + online/offline)
|
||
```bash
|
||
python ~/.server-connections/ssh.py --status
|
||
```
|
||
|
||
### Обновить заметки сервера
|
||
```bash
|
||
python ~/.server-connections/ssh.py --set-note ALIAS "описание сервера"
|
||
```
|
||
|
||
### Удалить сервер
|
||
```bash
|
||
python ~/.server-connections/ssh.py --remove ALIAS
|
||
```
|
||
**Спроси подтверждение у пользователя перед удалением!**
|
||
|
||
## SSH-команды (тип: ssh)
|
||
|
||
### Выполнить команду на сервере
|
||
```bash
|
||
python ~/.server-connections/ssh.py ALIAS "command"
|
||
```
|
||
Пример: `python ~/.server-connections/ssh.py investor "uptime"`
|
||
|
||
### Выполнить команду БЕЗ sudo
|
||
```bash
|
||
python ~/.server-connections/ssh.py ALIAS --no-sudo "command"
|
||
```
|
||
|
||
### Загрузить файл на сервер (ЕДИНСТВЕННЫЙ правильный способ)
|
||
```bash
|
||
python ~/.server-connections/ssh.py ALIAS --upload "D:/path/local/file" //remote/path/file
|
||
```
|
||
**ВАЖНО (Windows/Git Bash):** remote path ОБЯЗАТЕЛЬНО с двойным слешем `//home/...`, `//tmp/...`. Одинарный `/` будет сконвертирован Git Bash в Windows-путь и сломает SFTP.
|
||
**НИКОГДА не используй echo/base64/cat/stdin для передачи файлов — только `--upload`!**
|
||
|
||
### Скачать файл с сервера (ЕДИНСТВЕННЫЙ правильный способ)
|
||
```bash
|
||
python ~/.server-connections/ssh.py ALIAS --download //remote/path/file "D:/path/local/file"
|
||
```
|
||
Remote path тоже с `//`.
|
||
**НИКОГДА не используй scp/rsync/cat для скачивания — только `--download`!**
|
||
|
||
### Установить SSH-ключ на сервер
|
||
```bash
|
||
python ~/.server-connections/ssh.py ALIAS --install-key
|
||
```
|
||
|
||
### Проверить доступность сервера
|
||
```bash
|
||
python ~/.server-connections/ssh.py ALIAS --ping
|
||
```
|
||
|
||
## SQL-команды (типы: mariadb, mssql, postgresql)
|
||
|
||
### Выполнить SQL-запрос
|
||
```bash
|
||
python ~/.server-connections/ssh.py --sql ALIAS "SELECT * FROM users LIMIT 10"
|
||
```
|
||
|
||
### Список баз данных
|
||
```bash
|
||
python ~/.server-connections/ssh.py --sql-databases ALIAS
|
||
```
|
||
|
||
### Список таблиц
|
||
```bash
|
||
python ~/.server-connections/ssh.py --sql-tables ALIAS
|
||
python ~/.server-connections/ssh.py --sql-tables ALIAS mydb
|
||
```
|
||
|
||
## Redis-команды (тип: redis)
|
||
|
||
### Выполнить Redis-команду
|
||
```bash
|
||
python ~/.server-connections/ssh.py --redis ALIAS "GET mykey"
|
||
python ~/.server-connections/ssh.py --redis ALIAS "SET mykey myvalue"
|
||
```
|
||
|
||
### Информация о Redis
|
||
```bash
|
||
python ~/.server-connections/ssh.py --redis-info ALIAS
|
||
```
|
||
|
||
### Поиск ключей (SCAN)
|
||
```bash
|
||
python ~/.server-connections/ssh.py --redis-keys ALIAS "user:*"
|
||
```
|
||
|
||
## Grafana-команды (тип: grafana)
|
||
|
||
### Список дашбордов
|
||
```bash
|
||
python ~/.server-connections/ssh.py --grafana-dashboards ALIAS
|
||
```
|
||
|
||
### Список оповещений
|
||
```bash
|
||
python ~/.server-connections/ssh.py --grafana-alerts ALIAS
|
||
```
|
||
|
||
## Prometheus-команды (тип: prometheus)
|
||
|
||
### Выполнить PromQL-запрос
|
||
```bash
|
||
python ~/.server-connections/ssh.py --prom-query ALIAS "up"
|
||
python ~/.server-connections/ssh.py --prom-query ALIAS "rate(http_requests_total[5m])"
|
||
```
|
||
|
||
### Список целей (targets)
|
||
```bash
|
||
python ~/.server-connections/ssh.py --prom-targets ALIAS
|
||
```
|
||
|
||
### Список оповещений
|
||
```bash
|
||
python ~/.server-connections/ssh.py --prom-alerts ALIAS
|
||
```
|
||
|
||
## WinRM-команды (тип: winrm)
|
||
|
||
### PowerShell
|
||
```bash
|
||
python ~/.server-connections/ssh.py --ps ALIAS "Get-Process"
|
||
python ~/.server-connections/ssh.py --ps ALIAS "Get-Service | Where-Object {$_.Status -eq 'Running'}"
|
||
```
|
||
|
||
### CMD
|
||
```bash
|
||
python ~/.server-connections/ssh.py --cmd ALIAS "dir C:\\"
|
||
```
|
||
|
||
## Альтернативный способ (только SSH с установленным ключом)
|
||
```bash
|
||
unset SSH_ASKPASS && unset DISPLAY && ssh ALIAS "command"
|
||
```
|
||
|
||
## Поведение
|
||
|
||
- **Auto-sudo** (SSH): если user на сервере не root — команды автоматически оборачиваются в `sudo -S`, пароль подаётся через stdin. Тебе НЕ нужно добавлять `sudo` в команду
|
||
- **--no-sudo** (SSH): если команда не требует root (например `ls`, `cat`), используй `--no-sudo` для скорости
|
||
- **Windows SSH — автосанитизация**: при подключении к Windows серверам (определяется по alias/notes/os) Linux-команды автоматически транслируются в Windows-эквиваленты. Можно спокойно писать `ls`, `cat`, `grep`, `ps`, `df` — скрипт сам переведёт в `dir`, `type`, `Select-String`, `Get-Process`, и т.д. Pipe-цепочки (`cat file | grep error`) автоматически оборачиваются в PowerShell. Кодировка принудительно UTF-8 (`chcp 65001`). Команды `powershell ...`, `pwsh ...`, `cmd /c ...` проходят без изменений (passthrough). `sudo` автоматически удаляется, `chmod`/`chown` пропускаются с предупреждением
|
||
- **Timeout**: 120 секунд на SSH-команду, 10 секунд на SQL/Redis/HTTP-запросы, 15 секунд на подключение
|
||
- **SSH-ключ**: пробуется первым, fallback на пароль если ключ не подходит
|
||
- **Прогресс**: upload/download файлов >=1MB показывают 25/50/75% milestone, итог с размером/временем/скоростью
|
||
- **Тип сервера**: определяется автоматически из конфигурации. `--list` показывает тип каждого сервера
|
||
|
||
## Правила
|
||
|
||
- Отвечай на русском языке
|
||
- Показывай результат каждой операции
|
||
- При ошибках — объясняй причину и предлагай решение
|
||
- Если timeout — предложи проверить VPN/firewall/панель хостера
|
||
- Файлы создаваемые на сервере должны иметь права 664 (owner+group rw)
|
||
- При вопросе о серверах — СНАЧАЛА `--list`, потом `--info ALIAS` если нужны детали
|
||
- SQL-запросы: используй `LIMIT` для больших таблиц, чтобы не перегружать вывод
|
||
- Redis: используй SCAN, а не KEYS для больших баз
|
||
|
||
## КРИТИЧНО — Передача файлов
|
||
|
||
**ВСЕГДА используй `--upload` / `--download` для передачи файлов.** Это SFTP-протокол: надёжный, поддерживает любые размеры, показывает прогресс.
|
||
|
||
```bash
|
||
# Загрузить файл на сервер (SFTP)
|
||
python ~/.server-connections/ssh.py ALIAS --upload "D:/local/file" //remote/path/file
|
||
|
||
# Скачать файл с сервера (SFTP)
|
||
python ~/.server-connections/ssh.py ALIAS --download //remote/path/file "D:/local/file"
|
||
```
|
||
|
||
**ЗАПРЕЩЕНО** передавать файлы через:
|
||
- `echo "content" | ssh ALIAS "cat > file"` — обрежет бинарные данные
|
||
- `base64` чанки через `exec_command` — медленно, ненадёжно, ломается на больших файлах (exit 127)
|
||
- `cat file | ssh` или stdin-пайпы — не работает через Paramiko exec_command
|
||
- Любые "креативные" способы передачи через shell-команды
|
||
|
||
**Если нужно создать файл с текстом на сервере** — сначала создай локально (Write tool), потом `--upload`.
|
||
|
||
**Если нужно прочитать файл с сервера** — используй `ALIAS "cat /path/file"` для маленьких текстовых, или `--download` для больших/бинарных.
|