Linux #Linux #Ubuntu #Терминал #SSH #Сервер #Бэкап

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

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

15 минут 1
scp и rsync: копирование файлов по SSH
Содержание
  1. 1Как устроен адрес
  2. 2scp: быстро скопировать файл
  3. На сервер
  4. С сервера на свой компьютер
  5. Папку целиком
  6. Другой порт SSH
  7. 3rsync: копировать только изменения
  8. Основная команда
  9. Слеш в конце пути: самая частая ошибка
  10. Сначала проверить: --dry-run
  11. Зеркало: --delete
  12. Прогресс и итоги
  13. Докачка после обрыва: --partial
  14. Исключить лишнее
  15. Другой порт, сжатие, ограничение скорости
  16. С сервера к себе
  17. 4scp или rsync: что выбрать
  18. 5rsync на Mac
  19. 6Частые ошибки
  20. 7Главные советы
  21. 8Частые вопросы
  22. Как скопировать файл на сервер по SSH?
  23. Как скопировать файл с сервера на компьютер?
  24. Чем rsync лучше scp?
  25. Как указать порт в scp и rsync?
  26. Что значит слеш в конце пути в rsync?
  27. Как докачать прерванную передачу?
  28. Нужен ли 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/     # скопирует её содержимое
Вывод ls на сервере
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.

Статья помогла?

Комментарии

Пока никто не написал. Будьте первым — вопрос или свой опыт одинаково полезны.

Комментарий появится после проверки. Ссылки и реклама не публикуются.