Передача файлов через scp и rsync
scp копирует заданные пути через SSH, а rsync синхронизирует деревья и умеет передавать только различия. Главный риск rsync — не сеть, а неверная интерпретация source,…
scp копирует заданные пути через SSH, а rsync синхронизирует деревья и умеет передавать только различия. Главный риск rsync — не сеть, а неверная интерпретация source, destination и удаления, поэтому сначала нужен локальный dry-run.
Точный путь в scp
Форма user@host:path обозначает remote path. Относительный путь считается от домашнего каталога remote user, абсолютный начинается с slash.
scp ./artifact.tar.gz deploy@server.example:/srv/releases/incoming/
scp deploy@server.example:/var/log/app/report.txt ./reports/Двоеточие имеет синтаксический смысл. Для сложных сценариев, resume и больших деревьев удобнее rsync или sftp. Проверяйте host key так же строго, как при обычном ssh.
Trailing slash в rsync
Source без завершающего slash означает «скопировать сам каталог», со slash — «скопировать его содержимое».
mkdir -p /tmp/rsync-demo/source/sub /tmp/rsync-demo/dest
echo data >/tmp/rsync-demo/source/sub/file.txt
rsync -anv /tmp/rsync-demo/source /tmp/rsync-demo/dest/
rsync -anv /tmp/rsync-demo/source/ /tmp/rsync-demo/dest/Флаги -a включают рекурсию и сохранение набора атрибутов, -n делает dry-run, -v показывает план. Сравните destination trees в двух выводах до реального запуска.
Синхронизация через SSH
rsync -a --info=stats2,progress2 \
-e 'ssh -o IdentitiesOnly=yes' \
./public/ deploy@server.example:/srv/app/public/Rsync проверяет размер и mtime, а при необходимости вычисляет block differences. Опция --checksum меняет критерий и может дорого читать все файлы; она не является обязательным усилением каждого запуска.
Удаление требует отдельного решения
--delete удаляет в destination то, чего нет в source. Неверный source или пустой mount способен превратить deploy в массовое удаление. Используйте --dry-run --itemize-changes, проверяйте ожидаемый marker-файл source и делайте backup/snapshot. Ограничивайте destination явным абсолютным путём.
Ошибка и диагностика
Если результат оказался на уровень глубже, остановитесь и сравните trailing slash. Если передача прервалась, не запускайте вариант с --delete вслепую: сначала dry-run и status источника. Exit code rsync различает ошибки протокола, vanished files и частичную передачу; сохраните stderr и документацию к конкретному коду.
Практика
На локальных каталогах выполните два dry-run из примера, затем реальные копирования в разные destinations. Добавьте лишний файл в destination и исследуйте план с --delete, не снимая -n. Измените один файл и объясните itemized output.
Что важно запомнить
- В scp и rsync remote path и двоеточие нужно читать буквально до запуска.
- Trailing slash source меняет форму итогового дерева.
- --delete применяется только после dry-run, проверки source и наличия recovery point.