Передача файлов через 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.

Что важно запомнить

Источники