Files
server-manager/tools/skill-ssh.md
chrome-storm-c442 3a5d1b27fc v1.8.60: multi-type status check + --add in skill + skill docs update
- _check_status_one: proper connectivity check per server type
  (SSH/SQL/Redis/Grafana/Prometheus/WinRM/RDP)
- ping_server uses _check_status_one instead of paramiko-only
- check_status shows server type column
- skill-ssh.md: allow --add, document it, update --status description
- CLAUDE.md: add --add/--remove/--set-note to command reference

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-25 05:26:24 -05:00

12 KiB
Raw Blame History

Скилл /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. Разбери и выполни.

Общие команды

Список серверов (безопасный — 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 [--note "описание"]
  • Автоматически устанавливает 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-протокол: надёжный, поддерживает любые размеры, показывает прогресс.

# Загрузить файл на сервер (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"

ЗАПРЕЩЕНО использовать 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 для больших/бинарных.