Gymterview
junior

Как передавать файлы между машинами с помощью 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?» — завершающий слэш определяет, копируется содержимое или сама директория.