February 26

Передача файлов с scp и rsync: настройка и примеры

Передача файлов между серверами — задача настолько банальная, что о ней обычно не задумываешься… пока не столкнёшься с реальным проектом. Вот есть у тебя VPS, выделенный сервер или даже целый облачный кластер — и внезапно нужно быстро и надёжно перекинуть гигов десять логов, дампов или каких-нибудь картинок. FTP? Не смеши мои скрипты. Почта? Ну-ну. Вот тут и приходят на помощь старые добрые scp и rsync — инструменты, без которых не обходится ни один уважающий себя админ, DevOps или просто человек, который не любит таскать флешки.

О чём статья и зачем всё это нужно

Этот пост — не из серии «вот вам команды, копируйте и радуйтесь». Я расскажу, как работают scp и rsync, чем они реально отличаются, как быстро их настроить, какие грабли встречаются на пути и как их обойти. Будет много практики, примеры для реальных сценариев, советы по автоматизации и даже немного про нестандартные способы применения. Всё — чтобы вы могли не просто копировать файлы, а сделать это максимально быстро, безопасно и удобно, даже если у вас 20 серверов в разных дата-центрах.

Почему это важно: боль и значимость темы

  • Вам надо мигрировать сайт или сервис — и нужно перекинуть всё, что не лежит в git.
  • Вы делаете бэкапы и хотите, чтобы они точно доехали до удалённого хранилища, а не потерялись по пути.
  • Нужно автоматизировать деплой, чтобы скрипт сам раскидывал файлы по разным серверам без лишних движений.
  • Вы хотите быть уверены, что никто не перехватит ваши данные в пути.

Всё это — про scp и rsync. Но если не знать нюансов, можно нарваться на кучу проблем: от медленной передачи до случайной потери данных или дыр в безопасности.

Как это работает: алгоритмы, структура, суть

scp — Secure Copy Protocol

scp — это такой «копипаст» по SSH. По сути, это обёртка над ssh, которая просто берёт файл (или папку), соединяется с удалённой машиной и копирует туда (или обратно) через зашифрованный канал. Всё просто: никаких сложных протоколов, только SSH-ключи или пароли.

  • Работает практически на всех UNIX-подобных системах.
  • Передача идёт по одному потоку, без сжатия (по умолчанию).
  • Нет синхронизации — только «взял и скопировал».
  • Достаточно быстрый, но не оптимальный для больших объёмов или тысячи мелких файлов.

rsync — Remote Sync

rsync — это уже не просто копирование, а умная синхронизация. Он сравнивает файлы на исходной и целевой машине, копирует только изменённые части (или новые файлы), может сжимать данные на лету и даже работать по SSH (или по своему протоколу через rsyncd).

  • Очень экономит трафик — особенно если файлы почти не меняются.
  • Может работать как копия, так и синхронизация (двусторонняя или односторонняя).
  • Поддерживает инкрементальные копии, исключения, фильтры, сжатие, удаление лишнего на целевой стороне.
  • Идеально для бэкапов, деплоя, миграций.

Как быстро и просто всё настроить: практика и примеры

Базовая настройка scp

Всё, что вам нужно — это рабочий SSH-доступ к серверу (по ключу или паролю).

Копировать файл на удалённый сервер:

scp /home/user/file.txt user@remote_host:/home/user/

Копировать папку (рекурсивно):

scp -r /home/user/folder user@remote_host:/home/user/

Скачать файл с удалённого сервера:

scp user@remote_host:/home/user/file.txt /home/user/

Копировать между двумя удалёнными серверами (через вашу машину):

scp user1@host1:/path/file.txt user2@host2:/path/

Всё просто: указываете источник, цель и — если надо — порт (-P), если SSH не на стандартном 22-м.

Базовая настройка rsync

rsync обычно уже стоит в большинстве Linux-дистрибутивов. Если нет — ставим через apt install rsync или yum install rsync.

Синхронизировать локальную папку с удалённой по SSH:

rsync -avz /home/user/folder/ user@remote_host:/home/user/folder/

  • -a — архивный режим (сохраняет права, симлинки, рекурсивно)
  • -v — подробный вывод
  • -z — сжатие данных на лету

Скачать с удалённого сервера:

rsync -avz user@remote_host:/home/user/folder/ /home/user/folder/

Удалять файлы на целевой стороне, которых нет в источнике (полная синхронизация):

rsync -avz --delete /home/user/folder/ user@remote_host:/home/user/folder/

Синхронизировать только новые или изменённые файлы:

rsync -avzu /home/user/folder/ user@remote_host:/home/user/folder/

  • -u — не перезаписывать более новые файлы на целевой стороне

SSH-ключи для автоматизации

Чтобы не вводить пароль каждый раз (особенно в скриптах), используйте SSH-ключи:

ssh-keygen -t ed25519ssh-copy-id user@remote_host

Теперь scp и rsync будут работать без пароля.

Примеры и кейсы: что работает, а что нет

Положительный кейс: бэкап сайта

rsync -avz --delete /var/www/ user@backup_host:/backup/www/

— только новые и изменённые файлы, права, симлинки, всё как надо. Можно запускать по cron — и забыть о проблеме.

Отрицательный кейс: «scp -r» на 100 000 мелких файлов

Передаёт долго, нет докачки, если что-то упало — начинаем с нуля. Да и нагрузка на CPU не радует.

Кейс: автоматизация деплоя

rsync -avz --exclude='.git' --exclude='node_modules' ./ user@prod:/var/www/

— быстро, только нужные файлы, ничего лишнего не попадёт.

Ошибки новичков, мифы и похожие решения

  • Миф: scp быстрее. Факт: На больших объёмах и множестве файлов rsync быстрее за счёт сжатия и дельты.
  • Ошибка: Копировать папки без -r в scp — не сработает.
  • Ошибка: Забыли про пробелы в путях — экранируйте '/path with spaces/'.
  • Миф: rsync сложный. Факт: Базовые команды просты, а дальше — только если нужно.
  • Похожее решение: sftp — удобно для ручной работы, но не для автоматизации/скриптов.
  • Похожее решение: mc (Midnight Commander) — если любите TUI, но для скриптов не подходит.
  • Похожее решение: lftp — умеет mirror, но требует отдельной настройки, не так прозрачен по SSH.

Статистика и сравнение: что и когда использовать

scp — просто, быстро, но не оптимально для больших данных. rsync — экономит трафик, ускоряет повторные передачи, надёжнее при обрывах. По тестам в сети (например, ArchWiki), rsync на больших объёмах быстрее scp в 2-5 раз, особенно при повторных синхронизациях.

rsync умеет докачивать файлы, если соединение оборвалось — scp всё начнёт с нуля.

scp не умеет фильтровать файлы, а rsync — да (--exclude, --include).

Интересные факты и нестандартные применения

  • rsync как сетевой бенчмарк: rsync --progress /dev/zero user@remote:/dev/null — показывает реальную скорость канала.
  • rsync по локалке: Можно синхронизировать папки на одном сервере — быстрее, чем cp, если много файлов.
  • Передача через jump host (bastion): scp -o ProxyJump=user@jump_host file.txt user@target:/path/
  • rsyncd: Можно поднять отдельный rsync-сервер для массовых бэкапов (см. официальную документацию).

Автоматизация и скрипты: новые возможности

  • Скрипты бэкапа по cron — rsync с ключами, логированием и уведомлениями.
  • Деплой без downtime — rsync сначала, потом atomic swap симлинка.
  • Миграция между облаками — rsync с фильтрами, чтобы не тянуть мусор.
  • Мониторинг скорости и ошибок передачи — парсить вывод rsync для алертов.
  • Интеграция с Ansible, Salt, Chef — rsync под капотом для копирования файлов на кластеры.

Выводы и рекомендации: что выбрать и где использовать

  • scp — если нужно быстро закинуть или скачать пару файлов, без заморочек, вручную или в простом скрипте.
  • rsync — если нужно синхронизировать большие объёмы, делать бэкапы, деплой, миграции, автоматизацию. Экономит время, трафик и нервы.
  • Для автоматизации — только SSH-ключи, никаких паролей в скриптах!
  • Используйте rsync с опциями -avz и --delete для полной синхронизации.
  • Для передачи по нестандартному порту: scp -P порт или rsync -e 'ssh -p порт'.
  • Не забывайте про --exclude и --include в rsync — фильтруйте лишнее.
  • Если часто копируете между разными серверами — настройте alias-ы и используйте ssh-config для удобства.

Итого: scp и rsync — старые, надёжные, проверенные временем инструменты, которые отлично подходят для передачи файлов между серверами на Linux и не только. Освойте их — и ваши задачи по миграции, бэкапам и деплою станут проще и надёжнее.


Проверенный рецепт для надежной передачи больших файлов на Windows (виндовый клиент rsync - https://github.com/rn7s2/rsync-win)

# Первый запуск
rsync-win --progress --partial -s /cygdrive/d/archives.zip -d user@192.168.1.123:/home/user/1/

# Если оборвалось - просто повторяем ту же команду
rsync-win --progress --partial -s /cygdrive/d/archives.zip -d user@192.168.1.123:/home/user/1/

Дополнительно: проверка целостности после докачки
Если хотите гарантировать, что файл передался без ошибок после докачки:

# После завершения передачи проверьте контрольную сумму
rsync-win --checksum --partial -s /cygdrive/d/archives.zip -d user@192.168.1.123:/home/user/1/

Флаг --checksum заставит rsync сравнить содержимое, а не только размер и дату