scp и rsync: как скопировать файлы на сервер по SSH

Категория: Bash · Язык: Bash · Обновлено:

Для разового копирования файла на сервер подойдёт scp файл user@server:/путь/. Для папок и повторной синхронизации удобнее rsync -avz папка/ user@server:/путь/: он копирует только изменившиеся файлы и умеет возобновлять передачу.

scp: быстро скопировать

Bash
scp report.pdf user@server:/home/user/backup/                # файл на сервер
scp -r photos user@server:/home/user/backup/                 # папка целиком
scp user@server:/home/user/backup/report.pdf ./              # с сервера на свой компьютер
scp -P 2222 report.pdf user@server:/home/user/backup/        # нестандартный порт SSH (большая P)
scp -i ~/.ssh/id_ed25519 report.pdf user@server:/home/user/backup/   # указать ключ

Порт в scp задаётся ключом -P с большой буквы, в ssh и rsync -e с маленькой -p.

rsync: синхронизировать

Bash
rsync -avz site/ user@server:/home/user/backup/site/

Ключ

Что делает

-a

Архивный режим: рекурсивно, с правами, датами и ссылками

-v

Показывать, что копируется

-z

Сжимать данные при передаче

--progress

Показывать ход передачи файлов

-n или --dry-run

Только показать, что произойдёт, без копирования

--delete

Удалять на приёмнике файлы, которых нет в источнике

--exclude='*.log'

Не копировать файлы по маске

-e "ssh -p 2222"

Задать порт или параметры SSH

Косая черта в конце пути

Это самая частая причина путаницы:

Команда

Результат

rsync -a site/ /backup/

Содержимое site попадает прямо в /backup/

rsync -a site /backup/

Создаётся папка /backup/site/

Косая черта у источника означает «содержимое папки», без неё копируется сама папка.

Сначала проверить

Bash
rsync -avzn --delete site/ user@server:/home/user/backup/site/

Ключ -n покажет список изменений, включая удаляемые файлы. Если результат верный, повторите команду без -n.

Нестандартный порт, исключения, зеркало

Bash
rsync -avz -e "ssh -p 2222" --exclude='*.log' --exclude='cache/' site/ user@server:/home/user/backup/site/
rsync -avz --delete --progress site/ user@server:/home/user/backup/site/

Копирование между папками на одном компьютере

Bash
rsync -a --delete site/ /home/user/mirror/site/

Частые вопросы

Что лучше: scp или rsync?

scp проще для одного файла. rsync лучше для папок и повторных копирований: он передаёт только различия и умеет продолжать после обрыва. В новых версиях OpenSSH scp внутри использует протокол SFTP.

Как копировать без ввода пароля?

Настройте вход по ключу: создайте ssh-keygen -t ed25519 и добавьте публичный ключ на сервер командой ssh-copy-id user@server.

Как возобновить прерванную передачу большого файла?

Используйте rsync -avP файл user@server:/путь/: ключ -P включает --partial --progress и сохраняет частично переданные файлы.