14 KiB
Скилл /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 неудач — спам попытками УБЬЁТ доступ к серверу
- Серверы можно добавлять через
--add(см. ниже) или через GUI ServerManager
Аргументы
Пользователь передаёт через $ARGUMENTS. Разбери и выполни.
КРИТИЧНО — Команды зависят от типа сервера
--list возвращает колонку Type для каждого сервера. Тип определяет какие команды использовать:
| Тип | Команды |
|---|---|
ssh |
ALIAS "command", --upload, --download, --ping, --install-key |
telnet |
ALIAS "command" (как ssh, но без SFTP/sudo/ключей) |
mariadb / mssql / postgresql |
--sql, --sql-databases, --sql-tables |
redis |
--redis, --redis-info, --redis-keys |
grafana |
--grafana-dashboards, --grafana-alerts |
prometheus |
--prom-query, --prom-targets, --prom-alerts |
winrm |
--ps, --cmd |
rdp / vnc |
Только GUI (запуск внешнего клиента), CLI-команд нет |
ALIAS "command" — ТОЛЬКО для типа ssh. Для Redis — --redis, для SQL — --sql, для WinRM — --ps/--cmd и т.д.
# Тип redis → --redis-info, НЕ ALIAS "INFO"
python ~/.server-connections/ssh.py --redis-info "Reddis main ovh"
# Тип mariadb → --sql-databases, НЕ ALIAS "SHOW DATABASES"
python ~/.server-connections/ssh.py --sql-databases "Maria Db Connection main ovh"
# Тип ssh → ALIAS "command"
python ~/.server-connections/ssh.py investor "uptime"
Общие команды
Список серверов (безопасный — alias, тип, ключ, заметки)
python ~/.server-connections/ssh.py --list
Информация о сервере (безопасная — без IP/логина/пароля/порта)
python ~/.server-connections/ssh.py --info ALIAS
Статус всех серверов (alias + тип + online/offline)
python ~/.server-connections/ssh.py --status
Проверяет каждый сервер по его типу: SSH-подключение, SQL-коннект, Redis PING, HTTP health-check и т.д.
Обновить заметки сервера
python ~/.server-connections/ssh.py --set-note ALIAS "описание сервера"
Удалить сервер
python ~/.server-connections/ssh.py --remove ALIAS
Спроси подтверждение у пользователя перед удалением!
Добавить сервер
python ~/.server-connections/ssh.py --add ALIAS IP PORT USER PASSWORD [--type ssh|telnet|mariadb|mssql|postgresql|redis|grafana|prometheus|winrm|rdp] [--note "описание"] [--database DB] [--token TOKEN]
- Автоматически устанавливает SSH-ключ после добавления
- Обновляет
~/.ssh/config - Спроси у пользователя все параметры перед добавлением!
- Тип сервера по умолчанию — ssh. Для других типов (mariadb, redis и т.д.) — добавь через GUI
SSH-команды (тип: ssh)
Выполнить команду на сервере
python ~/.server-connections/ssh.py ALIAS "command"
Пример: python ~/.server-connections/ssh.py investor "uptime"
Выполнить команду БЕЗ sudo
python ~/.server-connections/ssh.py ALIAS --no-sudo "command"
Загрузить файл на сервер (ЕДИНСТВЕННЫЙ правильный способ)
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!
Скачать файл с сервера (ЕДИНСТВЕННЫЙ правильный способ)
python ~/.server-connections/ssh.py ALIAS --download //remote/path/file "D:/path/local/file"
Remote path тоже с //.
НИКОГДА не используй scp/rsync/cat для скачивания — только --download!
Установить SSH-ключ на сервер
python ~/.server-connections/ssh.py ALIAS --install-key
Проверить доступность сервера
python ~/.server-connections/ssh.py ALIAS --ping
SQL-команды (типы: mariadb, mssql, postgresql)
Выполнить SQL-запрос
python ~/.server-connections/ssh.py --sql ALIAS "SELECT * FROM users LIMIT 10"
Список баз данных
python ~/.server-connections/ssh.py --sql-databases ALIAS
Список таблиц
python ~/.server-connections/ssh.py --sql-tables ALIAS
python ~/.server-connections/ssh.py --sql-tables ALIAS mydb
Redis-команды (тип: redis)
Выполнить Redis-команду
python ~/.server-connections/ssh.py --redis ALIAS "GET mykey"
python ~/.server-connections/ssh.py --redis ALIAS "SET mykey myvalue"
Информация о Redis
python ~/.server-connections/ssh.py --redis-info ALIAS
Поиск ключей (SCAN)
python ~/.server-connections/ssh.py --redis-keys ALIAS "user:*"
Grafana-команды (тип: grafana)
Список дашбордов
python ~/.server-connections/ssh.py --grafana-dashboards ALIAS
Список оповещений
python ~/.server-connections/ssh.py --grafana-alerts ALIAS
Prometheus-команды (тип: prometheus)
Выполнить PromQL-запрос
python ~/.server-connections/ssh.py --prom-query ALIAS "up"
python ~/.server-connections/ssh.py --prom-query ALIAS "rate(http_requests_total[5m])"
Список целей (targets)
python ~/.server-connections/ssh.py --prom-targets ALIAS
Список оповещений
python ~/.server-connections/ssh.py --prom-alerts ALIAS
WinRM-команды (тип: winrm)
PowerShell
python ~/.server-connections/ssh.py --ps ALIAS "Get-Process"
python ~/.server-connections/ssh.py --ps ALIAS "Get-Service | Where-Object {$_.Status -eq 'Running'}"
CMD
python ~/.server-connections/ssh.py --cmd ALIAS "dir C:\\"
Альтернативный способ (только SSH с установленным ключом)
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-протокол с автоматическими фичами:
- Файлы >10MB: chunked upload с resume — при обрыве продолжит с того места
- Retry: adaptive retry — до 30 попыток для больших файлов (exponential backoff, min 5s)
- SHA256 верификация: автоматическая проверка целостности после загрузки
- Atomic rename: запись в .part файл → проверка → переименование
- Keepalive: SSH keepalive каждые 15 секунд — не обрывается NAT/роутером
- Прогресс: 25/50/75% для файлов >1MB
- Resume: при повторном запуске
--uploadавтоматически продолжает с .part файла (не начинает заново) - Windows SSH: SHA256 через PowerShell
Get-FileHash, пути автоматически нормализуются
# Загрузить файл на сервер (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"
Поведение при обрыве: соединение оборвалось → ждёт 5-30 сек → переподключается → проверяет .part файл на сервере → дозаливает с того места. Если файл полностью залит — проверяет SHA256 → atomic rename .part → финальный файл. Работает даже на нестабильных каналах (тестировано: 250MB через 6 reconnect'ов).
ЗАПРЕЩЕНО использовать shell-команды как способ передачи файлов на/с сервера:
echo "длинный_контент" > remote_file— обрежет данные, сломает бинарникиbase64чанки через exec_command — ненадёжно, ломается на больших файлах (exit 127)cat local_file | sshили stdin-пайпы — не работает через Paramiko exec_command- Любые "креативные" shell-методы переноса содержимого файлов
Это НЕ запрещает использовать echo, cat, base64 как обычные команды на сервере:
ALIAS "echo hello"— OK (выполнение команды)ALIAS "cat /etc/hosts"— OK (чтение файла на сервере)ALIAS "base64 -d config.b64 > config.bin"— OK (операция на сервере)
Если нужно передать файл на сервер — используй --upload. Если файл уже существует локально — заливай напрямую. Если нужно создать новый файл с нуля — создай локально (Write tool), потом --upload.
Если нужно прочитать файл с сервера — используй ALIAS "cat /path/file" для маленьких текстовых, или --download для больших/бинарных.