Full implementation of multi-type server management across GUI and CLI: New clients: SQLClient (MariaDB/MSSQL/PostgreSQL), RedisClient, GrafanaClient, PrometheusClient, TelnetSession, WinRMClient, RemoteDesktopLauncher. New GUI tabs: QueryTab (SQL editor + Treeview), RedisTab (console + history), GrafanaTab (dashboards + alerts), PrometheusTab (PromQL + targets), PowershellTab (PS/CMD), LaunchTab (RDP/VNC external client). Infrastructure: TAB_REGISTRY for conditional tabs per server type, adaptive server_dialog fields, colored type badges in sidebar, status checker for all types (SSH/TCP/SQL/Redis/HTTP), 100+ i18n keys. CLI: ssh.py extended with --sql, --redis, --grafana-*, --prom-*, --ps, --cmd. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
188 lines
7.4 KiB
Markdown
188 lines
7.4 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.
|
||
|
||
### Скачать файл с сервера
|
||
```bash
|
||
python ~/.server-connections/ssh.py ALIAS --download //remote/path/file "D:/path/local/file"
|
||
```
|
||
Remote path тоже с `//`.
|
||
|
||
### Установить 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` для скорости
|
||
- **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 для больших баз
|