Команда scp в Linux: копирование файлов на VPS (rsync, sftp)
- 14 ноября 2026 г.
- 09:00
- Автор: Adrien Roche
- Уроки

Команда scp в Linux: синтаксис и базовые передачи
scp (secure copy) копирует файлы между машинами по SSH, поэтому пользователь, ключ и порт, работающие для ssh, работают и для scp. Форма всегда одна: scp [options] SOURCE DESTINATION, а удалённая сторона записывается как user@host:path. Нужен рабочий вход по SSH; если порт 22 ещё не отвечает, сначала включите SSH в Ubuntu и защитите его.
1. С локальной машины на сервер (загрузка)
scp backup.tar.gz user@SERVER_IP:/home/user/
scp backup.tar.gz user@SERVER_IP:~/backups/renamed.tar.gz
scp *.conf user@SERVER_IP:~/nginx-conf/
Путь, оканчивающийся слешем, кладёт файл в этот каталог под исходным именем; полный путь переименовывает его при получении. Перед назначением можно указать несколько локальных файлов, если назначением служит каталог, и этот каталог должен уже существовать: scp не создаёт родительские каталоги.
2. С сервера на локальную машину (скачивание)
scp user@SERVER_IP:/var/log/nginx/access.log .
scp user@SERVER_IP:'/var/log/nginx/*.log' ./logs/
Точка означает «сюда, с тем же именем». Заключайте удалённые шаблоны в кавычки, чтобы их не раскрыла локальная оболочка. Копирование между двумя серверами тоже работает: scp -3 user@HOST_A:/data/dump.sql user@HOST_B:/data/ пропускает копию через вашу машину, так что доступ к обоим серверам нужен только ей.
3. Каталоги с ключом -r
scp -r ./site user@SERVER_IP:/var/www/
scp -r user@SERVER_IP:/etc/nginx ./nginx-backup
-r копирует каталог и всё его содержимое. Первая команда создаёт /var/www/site на сервере; вторая скачивает всё дерево nginx в локальную папку. Символические ссылки копируются как обычные файлы, и это одна из причин, почему для полных системных деревьев лучше подходит rsync.
Ключи scp, которые действительно нужны: -P, -i, -C, -p
scp -P 2222 file.txt user@SERVER_IP:/home/user/ # non-default SSH port
scp -i ~/.ssh/id_ed25519 file.txt user@SERVER_IP:~/ # use a specific key
scp -C dump.sql user@SERVER_IP:~/ # compress in transit
scp -rp ./site user@SERVER_IP:/var/www/ # keep times and modes
Ключ порта: заглавная -P. Строчная -p означает «сохранить время изменения, время доступа и биты прав», а поскольку сам ssh использует -p для порта, их путаница становится самой частой ошибкой в scp. Чтобы не повторять порт и ключ в каждом вызове, опишите хост один раз в ~/.ssh/config; его читают и scp, и rsync, и sftp:
Host vps
HostName SERVER_IP
User user
Port 2222
IdentityFile ~/.ssh/id_ed25519
Ещё два ключа: -l 8000 ограничивает передачу 8000 Кбит/с (около 1 МБ/с), а -v показывает, какие ключи предлагаются, когда аутентификация не проходит. Начиная с OpenSSH 9.0 scp внутри использует протокол SFTP; синтаксис не изменился, но приёмы оболочки, встроенные в удалённый путь (например, подстановка команд), больше не выполняются на сервере, а -O возвращает старый протокол для очень старых серверов, отвергающих новый режим.
rsync: зеркала, возобновляемые передачи и исключения
rsync копирует только изменившееся. Первый запуск ведёт себя как scp -r; последующие сравнивают обе стороны и передают лишь различия: новые файлы, а для изменённых только изменённые блоки. Поэтому это инструмент для деплоя, резервных копий и любых больших объёмов. Он должен быть установлен с обеих сторон (sudo apt install rsync); в некоторых минимальных образах и контейнерах его нет.
1. Повседневная команда
rsync -avz --progress ./site/ user@SERVER_IP:/var/www/site/
rsync -avz --progress user@SERVER_IP:/var/www/site/ ./site-backup/
-a (archive) разворачивается в -rlptgoD: рекурсия, сохранение символических ссылок как ссылок, прав, времени, группы, владельца и файлов устройств; владелец сохраняется, только если принимающая сторона работает от root. -v выводит список файлов, -z сжимает, --progress показывает каждый файл.
Завершающий слеш важен. ./site/ означает «содержимое site»; ./site означает «сам каталог», что создаст /var/www/site/site. Если сомневаетесь, добавьте -n (--dry-run) и просмотрите список файлов до того, как что-то будет записано.
2. Зеркало с --delete
rsync -avzn --delete ./site/ user@SERVER_IP:/var/www/site/ # dry run first
rsync -avz --delete ./site/ user@SERVER_IP:/var/www/site/
--delete удаляет в назначении файлы, которых больше нет в источнике. Настоящему зеркалу это нужно, но именно этот ключ превращает лишний слеш в стёртый каталог, поэтому каждую новую команду с --delete прогоняйте один раз вхолостую.
3. Исключение файлов
rsync -avz --exclude='node_modules/' --exclude='.git/' --exclude='*.log' ./app/ user@SERVER_IP:/srv/app/
rsync -avz --exclude-from='.rsyncignore' ./app/ user@SERVER_IP:/srv/app/
Шаблоны задаются относительно корня передачи; начальный слеш привязывает их, поэтому /config.php исключает только файл верхнего уровня. --exclude-from читает по одному шаблону в строке.
4. Возобновление незавершённой передачи, свой порт и ключ
rsync -avP -e 'ssh -p 2222 -i ~/.ssh/id_ed25519' ./disk.img user@SERVER_IP:/backup/
-P служит сокращением для --partial --progress: если соединение обрывается, недокачанный файл сохраняется, и повторный запуск той же команды продолжает с места остановки. Параметры SSH передаются через -e, и здесь порт задаётся строчной -p, потому что это ключ ssh, а не rsync; запись Host в ~/.ssh/config убирает всю строку -e.
sftp: интерактивная передача через тот же вход по SSH
sftp даёт приглашение в стиле FTP поверх SSH, что удобно, чтобы просмотреть файлы перед копированием.
sftp -P 2222 -i ~/.ssh/id_ed25519 user@SERVER_IP
sftp> ls -l /var/www
sftp> lcd ~/Downloads
sftp> get /var/log/syslog
sftp> put -r ./site /var/www/
sftp> reget backup.iso
sftp> bye
Команды, начинающиеся на l, действуют на вашей машине (lcd, lls, lpwd); остальные действуют на сервере. put -r и get -r копируют каталоги, reget и reput возобновляют прерванный файл, а !command выполняет локальную команду оболочки, не выходя из сессии. sftp -b commands.txt user@SERVER_IP проигрывает файл с такими командами, что удобно для заданий cron.
Копирование файлов из Windows: scp в PowerShell и WinSCP
В Windows 10 (сборка 1809 и новее) и Windows 11 есть клиент OpenSSH, поэтому scp, sftp и ssh доступны в PowerShell с теми же ключами, что и в Linux:
cd C:\Users\you\Projects
scp -P 2222 -i $HOME\.ssh\id_ed25519 .\site.zip user@SERVER_IP:/home/user/
scp -r user@SERVER_IP:/var/www/site $HOME\Downloads
Ключи лежат в C:\Users\you\.ssh\ рядом с known_hosts, и ssh-keygen -R SERVER_IP там тоже работает. Относительные пути после cd избавляют от путаницы между буквой диска и именем хоста. rsync в комплект не входит; чище всего получить его через WSL: wsl rsync -avz /mnt/c/Users/you/site/ user@SERVER_IP:/var/www/site/.
Для графического интерфейса обычно выбирают WinSCP: он поддерживает SFTP и SCP, показывает две панели с перетаскиванием, а команда Synchronize делает примерно то же, что rsync --delete. Он ожидает ключи в формате PuTTY .ppk и предлагает преобразовать ключ OpenSSH при его выборе. Для того, что разворачивается регулярно, однострочный scp или rsync в скрипте проще проверить и автоматизировать.
scp, rsync или sftp: что выбрать
| Задача | Лучший инструмент | Почему |
|---|---|---|
| Один файл, один раз | scp | Самая короткая команда, ничего ставить не нужно |
| Каталог, первое копирование | scp -r или rsync -a | Результат одинаковый |
| Повторяющийся деплой или резервные копии | rsync | Передаются только изменённые данные |
| Зеркало с удалениями | rsync --delete | scp не умеет удалять файлы |
| Возобновление большого файла | rsync -P или sftp reget | scp начинает заново с нуля |
| Просмотреть, затем выбрать файлы | sftp или WinSCP | Интерактивный просмотр |
| Тысячи мелких файлов | rsync или tar через ssh | В scp доминируют издержки на каждый файл |
| Windows без WSL | PowerShell scp или WinSCP | Нет встроенного rsync |
Простое правило: scp подходит, когда команду можно набрать по памяти, а rsync нужен, как только вы запустите её во второй раз.
Советы по скорости, которые реально работают
- Сжатие не бесплатно.
-C(scp) и-z(rsync) уменьшают текст, дампы SQL и логи, но зря тратят процессор на архивы, изображения и видео. Если во время передачиtopпоказываетsshdна 100%, уберите ключ. - Объединяйте множество мелких файлов. При отправке дерева исходников главные издержки создаёт обмен по каждому файлу; один поток быстрее:
tar czf - ./site | ssh user@SERVER_IP 'tar xzf - -C /var/www/'. - На быстрых каналах попробуйте другой шифр. Когда узким местом становится сам процесс ssh,
scp -c aes128-gcm@openssh.comзадействует инструкции AES, встроенные почти в каждый современный процессор. - Защищайте длительные передачи. Запускайте их внутри
tmuxилиscreen, чтобы обрыв сессии не убил копирование, или используйтеrsync -Pи перезапускайте. - Проверяйте и ограничивайте.
sha256sum fileс обеих сторон должен совпадать;scp -lилиrsync --bwlimitне даст резервному копированию задушить приложение.
Права, владелец и типичные ошибки
Permission denied по пути назначения
scp: /var/www//html/: Permission denied означает, что вход выполнен, но у этого пользователя нет прав на запись. Скопируйте в домашний каталог и перенесите файлы через sudo mv, передайте пользователю владение целевым каталогом (sudo chown -R user:user /var/www/site) или добавьте в rsync --rsync-path="sudo rsync"; последний вариант работает, если у пользователя есть sudo без пароля, как описано в статье создание пользователя с правами sudo в Linux. Загрузка от root ошибку убирает, но оставляет файлы, принадлежащие root, в которые веб-сервер писать не сможет: после этого выполните sudo chown -R www-data:www-data /var/www/site.
Permission denied (publickey)
Сервер отклонил аутентификацию. Проверьте имя пользователя, укажите ключ явно через -i, добавьте -v; на VPS причину покажет sudo journalctl -u ssh -n 30.
Remote host identification has changed
Ожидаемо после переустановки или смены IP: ключ хоста больше не совпадает с записью в ~/.ssh/known_hosts. Если вы действительно пересобрали сервер, выполните ssh-keygen -R SERVER_IP и подключитесь снова. Если нет, разберитесь в причине, прежде чем где-либо вводить пароль.
No such file or directory
scp не создаёт родительские каталоги: сначала выполните ssh user@SERVER_IP 'mkdir -p /var/www/site'. rsync создаёт только последний компонент пути (--mkpath в rsync 3.2.3+ создаёт и родительские).
rsync: command not found или protocol data stream (код 12)
rsync отсутствует на одной из сторон; выполните там sudo apt install rsync и повторите.
Загруженные скрипты не запускаются
У файлов из Windows нет бита выполнения и часто есть переводы строк CRLF, что даёт bad interpreter: No such file or directory. Исправьте обе проблемы командами chmod +x deploy.sh и sed -i 's/\r$//' deploy.sh; про строку shebang читайте в статье что такое файл .sh и как bash его выполняет. Последняя классика: scp file.txt user@SERVER_IP без двоеточия после хоста выполняет локальное копирование, которое молча создаёт файл с именем user@SERVER_IP.
Всё это предполагает сервер, к которому вы подключаетесь по SSH как root или пользователь с sudo, и где ограничением служит сама передача, а не квота. Linux VPS от rdp.monster и есть такая машина: полный root-доступ, выделенные CPU и RAM, безлимитный трафик (fair-use), без KYC, оплата криптовалютой, от $8.99 в месяц, а сервер выходит в онлайн примерно через 10 секунд после подтверждения оплаты, так что первой командой на нём может стать тот самый scp из первого шага.
Часто задаваемые вопросы
Устарела ли команда scp?
scp передаёт файлы по SFTP. Сама команда, её ключи и синтаксис user@host:path не изменились, поэтому существующие скрипты продолжают работать; иначе ведёт себя только раскрытие оболочкой внутри удалённых путей, а -O возвращает старый протокол для серверов, которым он нужен. Для новой автоматизации возможностей больше у rsync или sftp, но для разовых копий scp вполне подходит.Можно ли использовать scp с паролем вместо SSH-ключа?
PasswordAuthentication yes, scp запросит пароль и продолжит копирование; ключа для передачи пароля в командной строке нет, а инструменты вроде sshpass оставляют его в истории оболочки. На защищённых серверах вход по паролю обычно отключён, и тогда scp завершается ошибкой Permission denied (publickey), пока вы не установите ключ через ssh-copy-id. Именно ключи позволяют скриптам работать без участия человека.Перезаписывает ли scp существующие файлы без предупреждения?
-n (--dry-run) печатает, что изменится, --ignore-existing не трогает уже существующие файлы, --update пропускает файлы, которые в назначении новее, а --backup --backup-dir=DIR сохраняет заменённые версии. Для незаменимых данных копируйте в новый каталог и подменяйте его после.Как копировать файлы напрямую между двумя VPS?
rsync -avz /data/ user@OTHER_IP:/data/ (или scp -r), чтобы данные не шли через ваш домашний канал. Для этого на первом сервере должен быть ключ, который принимает второй. Если размещать ключи на серверах не хочется, scp -3 user@HOST_A:/path user@HOST_B:/path копирует через вашу машину, используя только локальные учётные данные, ценой одной загрузки и одной выгрузки всего объёма.Adrien Roche, Редактор по инфраструктуре и хостингу
Системный инженер с более чем 10-летним опытом эксплуатации парков Windows Server и Linux. Адриен ведёт документацию по инфраструктуре rdp.monster и пишет наши руководства по RDP, VPS-хостингу, администрированию серверов, сетям и инструментам приватности.




