CLI AI

Удалённые задачи по-русски: ssh, scp и rsync без танца с флагами

2026-03-27

У всех, кто работает с тремя и более серверами, есть момент: набрали rsync, остановились, задумались — это -a или -r? нужен --delete? куда хвостовой слэш? Один хвостовой слэш стоил больше падений, чем люди готовы признать.

1. Sync с типовыми исключениями

clai
$ clai rsync этой папки на staging:/srv/app/ кроме node_modules и .git→ rsync -avz --delete --exclude='node_modules' --exclude='.git' \    ./ staging:/srv/app/

Хвостовой слэш на ./ имеет значение. CliAI ставит его правильно. Заметьте: --delete включён, потому что «sync» подразумевает, что назначение зеркалирует источник, — но этот флаг из тех, что стоит подтвердить перед Enter.

2. SSH с форвардом локального порта

clai
$ clai зайди по ssh на prod-db и проброс локальный 5432 в его postgres→ ssh -L 5432:localhost:5432 prod-db

Синтаксис форварда (-L local:remote_host:remote_port) из тех, что не запоминаются, пока не используешь еженедельно в течение года.

3. SCP директории

clai
$ clai scp всю директорию reports со staging:/srv/reports в ./reports→ scp -r staging:/srv/reports ./reports

-r обязателен для директорий; без него scp молча ничего полезного не делает. CliAI знает; вам не обязательно.

4. Сохранение прав и временных меток

clai
$ clai скопируй /etc/nginx с prod сюда с сохранением прав и временных меток→ rsync -avz --rsync-path='sudo rsync' prod:/etc/nginx/ ./nginx-backup/

--rsync-path='sudo rsync' — правильный паттерн, когда исходный путь требует root для чтения, а ssh идёт от обычного пользователя. Сложно вспомнить, легко попросить.

Напоминание про аутентификацию

CliAI генерирует команду; SSH-ключи и хосты не настраивает. Если ssh staging не работает в терминале, сгенерированная команда тоже не сработает. Один раз вложитесь в ~/.ssh/config и ssh-agent — и эти однострочники окупаются навсегда.

См. также