Как скопировать файлы на сервер и обратно: scp и rsync
Как передать файлы и папки между компьютером и сервером по SSH: scp для разовых копий и rsync для синхронизации и бэкапов. Копирование с сервера и на сервер, другой порт, исключения, докачка, проверка через --dry-run и коварный слеш в конце пути.

Содержание
- 1Как устроен адрес
- 2scp: быстро скопировать файл
- На сервер
- С сервера на свой компьютер
- Папку целиком
- Другой порт SSH
- 3rsync: копировать только изменения
- Основная команда
- Слеш в конце пути: самая частая ошибка
- Сначала проверить: --dry-run
- Зеркало: --delete
- Прогресс и итоги
- Докачка после обрыва: --partial
- Исключить лишнее
- Другой порт, сжатие, ограничение скорости
- С сервера к себе
- 4scp или rsync: что выбрать
- 5rsync на Mac
- 6Частые ошибки
- 7Главные советы
- 8Частые вопросы
- Как скопировать файл на сервер по SSH?
- Как скопировать файл с сервера на компьютер?
- Чем rsync лучше scp?
- Как указать порт в scp и rsync?
- Что значит слеш в конце пути в rsync?
- Как докачать прерванную передачу?
- Нужен ли rsync на сервере?
Залить сайт на VPS, забрать с сервера бэкап базы, перенести фотоархив на домашний сервер — всё это задачи «скопировать файлы по SSH». Если вы уже заходите на сервер командой ssh, то и копировать можете без FTP, Samba и дополнительных программ: всё нужное уже установлено.
Инструментов два. scp — простое копирование, как cp, только между компьютерами. rsync — синхронизация: передаёт только изменённое, докачивает после обрыва и умеет зеркалить папки. Ниже — оба, с примерами на каждый день. Все выводы — настоящие: я копировал файлы между двумя машинами на Ubuntu 24.04 (OpenSSH 9.6, rsync 3.2.7). Сервер в примерах называется server, пользователь на нём — anna.
Как устроен адрес
И scp, и rsync понимают одинаковую запись удалённого пути:
пользователь@сервер:путь- 👤 пользователь — под кем вы входите по SSH. Если совпадает с вашим локальным именем, можно не писать.
- 🖥 сервер — IP-адрес (
192.168.1.25) или имя (server,example.com). - 📂 путь после двоеточия — на сервере.
~/— домашняя папка пользователя,/var/www/— абсолютный путь.
Двоеточие — главное. Без него scp файл server просто скопирует файл в локальный файл с именем server.
scp: быстро скопировать файл
На сервер
scp proekt.tar.gz anna@server:~/proekt.tar.gz 100% 33KB 33.1MB/s 00:00Можно передать несколько файлов сразу — последним указывается место назначения:
scp proekt.tar.gz desktop.webp anna@server:~/uploads/С сервера на свой компьютер
Порядок тот же: откуда → куда. Точка в конце значит «в текущую папку»:
scp anna@server:~/proekt/docs/plan.txt .Папку целиком
Для папок нужен ключ -r. Без него scp откажется:
scp: local "proekt" is not a regular file
scp: failed to upload file proekt to ~/Правильно:
scp -r proekt anna@server:~/Другой порт SSH
Если SSH на сервере слушает не 22, а, например, 2222, порт передаётся ключом -P с большой буквы (с маленькой -p сохраняет даты файлов):
scp -P 2222 backup.tar.zst anna@server:~/У scp один большой минус: он всегда копирует всё заново. Оборвалась связь на 90 % гигабайтного файла — начинайте сначала. Для больших объёмов и повторяющихся задач берите rsync.
rsync: копировать только изменения
rsync почти всегда уже есть в Ubuntu и Debian. Важно, чтобы он был установлен на обеих машинах — и у вас, и на сервере:
sudo apt install rsyncЕсли на сервере его нет, ошибка выглядит непонятно:
bash: line 1: rsync: command not found
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: error in rsync protocol data stream (code 12) at io.c(232) [sender=3.2.7]Основная команда
rsync -avh foto anna@server:~/Ключи, которые стоит запомнить сразу:
- 📦
-a(archive) — рекурсивно, с сохранением прав, дат, ссылок. Почти всегда нужен. - 💬
-v— показывать, что копируется. - 📏
-h— размеры в K, M, G.
Первый запуск передаёт всё — у меня это папка с 561 картинкой на 21 МБ:
sending incremental file list
foto/
foto/3utools-akkumulyator-ipad-480.webp
foto/3utools-akkumulyator-ipad-800.webp
...
foto/udalit-fon-og.png
sent 21.02M bytes received 10.68K bytes 42.07M bytes/sec
total size is 20.97M speedup is 1.00А вот второй запуск той же команды, когда ничего не изменилось:
sending incremental file list
sent 24.96K bytes received 17 bytes 16.65K bytes/sec
total size is 20.97M speedup is 839.70Вместо 21 МБ передано 25 КБ — только список файлов для сравнения. speedup is 839.70 значит, что rsync сэкономил в 840 раз. Это и есть главная причина им пользоваться: бэкап папки на десятки гигабайт после первого раза занимает секунды.
Слеш в конце пути: самая частая ошибка
У rsync есть правило, на котором спотыкаются все. Есть разница, ставить ли / в конце исходной папки:
rsync -a proekt anna@server:~/t1/ # скопирует саму папку
rsync -a proekt/ anna@server:~/t2/ # скопирует её содержимоеt1:
proekt
t2:
docs
foto
run.shЗапомнить так: слеш в конце значит «содержимое этой папки». Без слеша — «эту папку целиком». Для синхронизации двух одинаковых папок почти всегда нужен вариант со слешем: rsync -a foto/ server:~/foto/.
Сначала проверить: --dry-run
Ключ -n (или --dry-run) показывает, что rsync сделал бы, но ничего не трогает. Используйте его каждый раз, когда сомневаетесь, — особенно вместе с --delete:
rsync -avhn --delete foto/ anna@server:~/foto/sending incremental file list
deleting old-copy.webp
./
ubuntu-vbox-rabochiy-stol.webp
sent 24.52K bytes received 44 bytes 49.12K bytes/sec
total size is 20.97M speedup is 853.86 (DRY RUN)Видно: один изменённый файл будет передан, а old-copy.webp, которого нет у меня локально, — удалён на сервере. Пометка (DRY RUN) в конце подтверждает, что ничего не произошло.
Зеркало: --delete
По умолчанию rsync только добавляет и обновляет файлы. Если вы удалили файл у себя, на сервере он останется. Чтобы получить точную копию, добавьте --delete:
rsync -avh --delete foto/ anna@server:~/foto/Прогресс и итоги
Для одного большого файла удобен --progress, для папки из тысяч файлов — общая шкала --info=progress2:
rsync -ah --info=progress2 foto/ anna@server:~/foto2/ 20.97M 100% 84.35MB/s 0:00:00 (xfr#561, to-chk=0/562)xfr#561 — передан 561 файл, to-chk=0/562 — осталось проверить 0 из 562. Подробная статистика после копирования — ключ --stats.
Докачка после обрыва: --partial
Если передача прервалась, rsync по умолчанию удаляет недокачанный файл. С ключом --partial он его сохраняет и при следующем запуске докачивает. Я проверил на файле 200 МБ: оборвал передачу через 3 секунды — на сервере остался кусок на 60 МБ. Повторный запуск дотянул файл до конца:
rsync -ah --partial --info=progress2 film.bin anna@server:~/ 209.72M 100% 94.51MB/s 0:00:02 (xfr#1, to-chk=0/1)Для больших файлов по нестабильному каналу удобно сразу писать -P — это --partial --progress вместе.
Исключить лишнее
Кэш, логи, временные файлы и node_modules в бэкап обычно не нужны:
rsync -avh --exclude='cache/' --exclude='*.log' site/ anna@server:~/site/Если исключений много, запишите их в файл по одному на строку и передайте --exclude-from=exclude.txt.
Другой порт, сжатие, ограничение скорости
rsync -avh -e "ssh -p 2222" site/ anna@server:~/site/ # SSH на порту 2222
rsync -avhz logs/ anna@server:~/logs/ # сжимать при передаче
rsync -avh --bwlimit=5m foto/ anna@server:~/foto/ # не больше 5 МБ/с- 🗜
-zполезен для текстов, логов и баз данных на медленном канале. Для фото, видео и архивов он только тратит процессор — они уже сжаты. - 🐢
--bwlimitвыручает, когда бэкап по домашнему интернету не должен забирать весь канал.
С сервера к себе
Направление меняется так же, как у scp, — просто поменяйте местами источник и назначение:
rsync -avh anna@server:~/proekt/docs/ ./from-server/scp или rsync: что выбрать
| Задача | Что взять |
|---|---|
| Один-два файла, разово | scp |
| Папка, которую вы будете обновлять | rsync -a |
| Большой файл по нестабильной связи | rsync -P |
| Точная копия папки (зеркало) | rsync -a --delete |
| Регулярный бэкап по расписанию | rsync -a в cron или таймере systemd |
| На сервере нет rsync и поставить нельзя | scp -r |
Для регулярного бэкапа rsync ставят в расписание. Готовую строку для cron можно собрать в генераторе cron, а если нужен лог и автоперезапуск — таймер systemd. Долгую первую синхронизацию по SSH лучше запускать внутри tmux, чтобы она не оборвалась вместе с соединением.
rsync на Mac
В macOS rsync тоже есть, но в свежих версиях системы это не оригинальный rsync, а совместимая замена, и часть ключей может работать иначе. Если какой-то пример из статьи на Mac не сработал, поставьте настоящий rsync через Homebrew: brew install rsync.
Частые ошибки
- 📍 Забыли двоеточие.
scp file serverсоздаёт локальный файлserver, а не копирует на сервер. - 🔢
-pвместо-Pу scp. Маленькая буква сохраняет даты, порт задаётся большой. - ➗ Слеш в rsync.
fotoиfoto/— разные вещи: папка целиком или её содержимое. - 🧨
--deleteбез проверки. Сначала-n, потом настоящий запуск. - 🔐 Permission denied. У пользователя на сервере нет прав на запись в папку назначения. Копируйте в домашнюю папку и переносите через
sudo mv, либо выдайте права на папку. - ❌ rsync не установлен на сервере. Ошибка
code 12иconnection unexpectedly closed— поставьте rsync на обе машины.
Главные советы
- Откуда → куда. И в scp, и в rsync сначала источник, потом назначение. Удалённый путь — всегда с двоеточием.
- Для повторяющихся задач — rsync. Второй запуск передаёт только изменения: у меня это 25 КБ вместо 21 МБ.
- Следите за слешем.
папка/— содержимое,папка— сама папка. - Сначала
-n. Пробный запуск покажет, что будет скопировано и удалено. - Большие файлы — с
-P. Оборвалось — запустите ещё раз, rsync докачает. - Настройте вход по ключу. Тогда scp и rsync не спрашивают пароль и легко встают в расписание.
Частые вопросы
Как скопировать файл на сервер по SSH?
Командой scp файл пользователь@сервер:путь, например scp backup.zip anna@192.168.1.25:~/. Для папки добавьте -r. Если SSH работает на другом порту, укажите его ключом -P.
Как скопировать файл с сервера на компьютер?
Поменяйте местами источник и назначение: scp anna@server:~/backup.zip . — точка означает текущую папку. С rsync так же: rsync -avh anna@server:~/backup/ ./backup/.
Чем rsync лучше scp?
rsync передаёт только новые и изменённые файлы, умеет докачивать после обрыва (--partial), удалять лишнее для точной копии (--delete) и показывать, что сделает, без выполнения (-n). scp проще, но каждый раз копирует всё заново.
Как указать порт в scp и rsync?
В scp — ключ -P с большой буквы: scp -P 2222 файл anna@server:~/. В rsync порт передаётся через параметры ssh: rsync -avh -e "ssh -p 2222" папка/ anna@server:~/папка/.
Что значит слеш в конце пути в rsync?
Слеш у исходной папки значит «скопировать её содержимое». Без слеша rsync скопирует саму папку и создаст её внутри назначения. rsync -a foto/ server:~/foto/ синхронизирует две папки, а rsync -a foto server:~/foto/ создаст ~/foto/foto.
Как докачать прерванную передачу?
Запустите ту же команду rsync с ключом --partial или -P. Он сохранит недокачанный файл и продолжит передачу. scp так не умеет — он начнёт сначала.
Нужен ли rsync на сервере?
Да, для копирования по SSH rsync должен быть установлен на обеих сторонах. В Ubuntu и Debian — sudo apt install rsync. Если поставить его на сервер нельзя, используйте scp -r.
Если статья пригодилась — отметьте, это помогает выбирать темы
Статья помогла?
Комментарии
Пока никто не написал. Будьте первым — вопрос или свой опыт одинаково полезны.