У всех, кто работает с тремя и более серверами, есть момент: набрали rsync, остановились, задумались — это -a или -r? нужен --delete? куда хвостовой слэш? Один хвостовой слэш стоил больше падений, чем люди готовы признать.
1. Sync с типовыми исключениями
$ 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 зайди по ssh на prod-db и проброс локальный 5432 в его postgres→ ssh -L 5432:localhost:5432 prod-db
Синтаксис форварда (-L local:remote_host:remote_port) из тех, что не запоминаются, пока не используешь еженедельно в течение года.
3. SCP директории
$ clai scp всю директорию reports со staging:/srv/reports в ./reports→ scp -r staging:/srv/reports ./reports
-r обязателен для директорий; без него scp молча ничего полезного не делает. CliAI знает; вам не обязательно.
4. Сохранение прав и временных меток
$ 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 — и эти однострочники окупаются навсегда.
См. также
- Сжатие и загрузка в S3 — когда «удалённо» значит object storage, а не другая машина.
- Сетевая диагностика — когда удалённая команда падает по сети, а не по синтаксису.