Как передавать файлы между машинами с помощью scp и rsync?
scp и rsync — команды для копирования файлов между локальной машиной и удалённым сервером (или между двумя серверами) через SSH. scp проще в использовании, rsync значительно мощнее и эффективнее.
scp (Secure Copy)
scp копирует файлы через SSH, каждый раз передавая файл целиком:
Пример
# Копировать файл на сервер
scp file.txt user@server:/tmp/
# Копировать файл с сервера
scp user@server:/var/log/app.log .
# Копировать директорию рекурсивно
scp -r project/ user@server:/opt/
# Указать порт
scp -P 2222 file.txt user@server:/tmp/
# Копирование между двумя серверами
scp user1@server1:/data/file.txt user2@server2:/data/
# Используя алиас из ~/.ssh/config
scp file.txt production:/opt/deploy/
rsync — продвинутая синхронизация файлов
rsync превосходит scp по эффективности: передаёт только изменившиеся части файлов (дельта-копирование), поддерживает сжатие, возобновление передачи и множество опций.
Пример
# Базовая синхронизация
rsync -av source/ user@server:/dest/
# -a = archive (рекурсивно, сохраняет права, время, символические ссылки)
# -v = verbose
# С прогрессом и сжатием
rsync -avz --progress source/ user@server:/dest/
# -z = сжатие при передаче
# Синхронизация с удалением лишних файлов на приёмнике
rsync -av --delete source/ user@server:/dest/
# Исключение файлов
rsync -av \
--exclude='target' \
--exclude='.git' \
--exclude='*.log' \
project/ user@server:/opt/project/
# Через нестандартный SSH-порт
rsync -av -e 'ssh -p 2222' source/ user@server:/dest/
# Пробный запуск (показать, что будет сделано, без фактического копирования)
rsync -avn source/ user@server:/dest/
# -n = dry-run
Внимание: завершающий
/у source имеет значение!rsync -av source/ dest/копирует содержимое source в dest, аrsync -av source dest/копирует саму директорию source в dest (создаст dest/source/).
Сравнение scp и rsync
| Характеристика | scp | rsync |
|---|---|---|
| Дельта-копирование | Нет (всегда копирует полностью) | Да (передаёт только изменения) |
| Возобновление | Нет | Да (--partial) |
| Сжатие при передаче | Нет | Да (-z) |
| Исключения | Нет | Да (--exclude) |
| Удаление лишнего | Нет | Да (--delete) |
| Dry-run | Нет | Да (-n) |
| Простота | Проще | Сложнее, но значительно мощнее |
Практический пример — деплой Java-приложения
Пример
#!/bin/bash
set -euo pipefail
# Сборка и деплой
mvn clean package -DskipTests
rsync -avz --progress target/app.jar deploy@production:/opt/app/
ssh production 'sudo systemctl restart myapp'
На собеседовании: основной посыл:
scp— для разовых копирований,rsync— для регулярной синхронизации и деплоя. Упомяните дельта-копирование и флаг--dry-runкак ключевые преимущества rsync. Вопрос-ловушка: «в чём разница междуrsync source/иrsync source?» — завершающий слэш определяет, копируется содержимое или сама директория.