Files
server-manager/tools/skill-ssh.md
chrome-storm-c442 9b0e4c76a3 v1.9.0: S3 server type — bucket/object browser, drag-and-drop upload, resilient transfers
New server type: S3 (MinIO, AWS, any S3-compatible storage)
- core/s3_client.py: boto3 client with auto-reconnect, 10 retries, exponential backoff, multipart upload/download, tcp_keepalive
- gui/tabs/s3_tab.py: object browser (Treeview), bucket selector, folder navigation, drag-and-drop upload from Explorer (windnd), progress bar with %, multi-file upload
- CLI: --s3-buckets, --s3-ls, --s3-upload, --s3-download, --s3-delete with retry
- ServerDialog: access_key, secret_key, bucket fields
- Registration: server_store, connection_factory, status_checker, icons, app, i18n (EN/RU/ZH)
- Fix: build.py cleanup_old_releases now sorts by semver (was lexicographic, broke v1.8.100+)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-03-03 06:32:03 -05:00

15 KiB
Raw Permalink Blame History

Скилл /ssh — управление удалёнными серверами

Ты управляешь удалёнными серверами через универсальную CLI-утилиту. Поддерживаются: SSH, SQL (MariaDB/MSSQL/PostgreSQL), Redis, S3, 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
s3 --s3-buckets, --s3-ls, --s3-upload, --s3-download, --s3-delete
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|s3] [--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:*"

S3-команды (тип: s3)

Список бакетов

python ~/.server-connections/ssh.py --s3-buckets ALIAS

Список объектов

python ~/.server-connections/ssh.py --s3-ls ALIAS bucket
python ~/.server-connections/ssh.py --s3-ls ALIAS bucket/prefix/

Загрузить файл в S3

python ~/.server-connections/ssh.py --s3-upload ALIAS "D:/local/file" bucket/key

Скачать файл из S3

python ~/.server-connections/ssh.py --s3-download ALIAS bucket/key "D:/local/file"

Удалить объект

python ~/.server-connections/ssh.py --s3-delete ALIAS bucket/key

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 для больших/бинарных.