Как копировать файлы командой scp в Linux: синтаксис, примеры и SFTP под капотом

Как копировать файлы командой scp в Linux: синтаксис, примеры и SFTP под капотом

scp копирует файлы между хостами поверх SSH: та же аутентификация, то же шифрование, никакого отдельного демона. По man-странице scp в актуальном OpenSSH утилита передаёт данные по протоколу SFTP, а не по старому протоколу scp/rcp. Ниже синтаксис, рабочие примеры и что поменялось в последних версиях OpenSSH, вплоть до 10.6 от 6 октября 2026 года.

Синтаксис и основные ключи

scp [ключи] источник ... назначение

Как у cp: слева что копируем, справа куда. Удалённый путь пишется как user@host:/path, можно и в виде URI scp://user@host:port/path. Если в имени локального файла есть двоеточие, пишите его через ./ или абсолютный путь, иначе scp примет его за адрес хоста.

  • -r копирует каталоги рекурсивно, символические ссылки при этом раскрываются.
  • -P задаёт порт SSH. Буква большая, потому что маленькая -p уже занята.
  • -p сохраняет время изменения, время доступа и права файла.
  • -i указывает приватный ключ.
  • -J идёт через jump host, это то же самое, что ProxyJump в ssh_config.
  • -C включает сжатие, полезно на медленном канале и текстовых данных.
  • -l ограничивает скорость, значение в Кбит/с.
  • -q убирает индикатор прогресса, -v включает отладку.
  • -O включает старый протокол scp вместо SFTP.

Примеры на каждый день

Залить файл на сервер, в том числе с новым именем:

scp file.txt user@192.168.1.10:/home/user/
scp file.txt user@192.168.1.10:/home/user/file_new_name.txt

Каталог целиком и нестандартный порт:

scp -r folder/ user@192.168.1.10:/home/user/
scp -P 2222 file.txt user@192.168.1.10:/home/user/

Если на нестандартном порту приходит Connection refused, дело почти всегда не в scp: sshd слушает другой порт или его режет файрвол или группа безопасности у облака.

Скачать с сервера в текущий каталог:

scp user@192.168.1.10:/home/user/file.txt ./
scp -r user@192.168.1.10:/home/user/folder/ ./

С отдельным ключом, через бастион и с ограничением скорости, чтобы не забить канал на проде:

scp -i ~/.ssh/id_deploy file.txt user@host:/var/www/
scp -J admin@bastion.example.com backup.tar.gz user@10.0.0.5:/srv/
scp -l 50000 big.iso user@host:/tmp/   # примерно 50 Мбит/с

Копирование между двумя удалёнными серверами

scp user1@192.168.1.10:/path/file.txt user2@192.168.1.20:/path/dest/

С OpenSSH 8.7 (август 2021) такая копия по умолчанию идёт через вашу машину, раньше это включалось ключом -3. Так не нужно хранить ключи доступа ко второму серверу на первом, и серверам не обязательно видеть друг друга. Минус в том, что весь объём проходит через ваш канал, на гигабайтах это заметно.

Прямую копию с первого сервера на второй делает ключ -R: scp запускается на исходном сервере, и тот должен сам входить на второй без пароля. В OpenSSH 10.6 ключ -R объявлен устаревшим: пока он работает, но пишет предупреждение, а в одной из следующих версий будет игнорироваться, и копия пойдёт через ваш хост. Если у вас в скриптах есть scp -R, лучше переделать их сейчас.

SFTP вместо старого протокола и ключ -O

В OpenSSH 9.0 (апрель 2022) scp перешёл со старого протокола scp/rcp на SFTP по умолчанию. Старый протокол раскрывал маски в именах файлов через оболочку удалённой стороны, отсюда двойное экранирование и целый класс уязвимостей. В Ubuntu 24.04 и Debian 12 уже OpenSSH 9.x, так что там scp работает по SFTP. Версию проверить просто: ssh -V.

Для обычной работы разницы почти нет. Старый протокол через -O нужен, если на сервере нет SFTP (например, отключена подсистема sftp в sshd_config), если скрипт полагается на старое поведение масок или на пути с ~ на очень старом SFTP-сервере. В режиме -O маски раскрывает удалённая оболочка, поэтому кавычки и спецсимволы надо экранировать аккуратно.

Безопасность и типичные грабли

  • scp молча перезаписывает существующий файл на цели. Перед массовым копированием проверьте пути.
  • В скриптах и CI используйте ключи, а не пароли. Права на приватный ключ 600.
  • Не путайте -P и -p: первый задаёт порт, второй сохраняет время и права.
  • Файл может приехать, а сервис его не прочитает из-за владельца, прав или контекста SELinux и AppArmor.
  • Если копия зависла или не проходит вход, запустите с -v: в выводе видно, на каком шаге ssh застрял.

Для регулярных выкладок и синхронизации каталогов удобнее rsync -avz -e ssh: он докачивает, умеет исключения и передаёт только изменения. scp хорош для разовых задач: закинуть конфиг, забрать лог или бэкап.

В итоге scp остаётся самым быстрым способом скопировать файл по SSH, только теперь это SFTP под капотом, копия между двумя серверами по умолчанию идёт через вашу машину, а ключ -R доживает последние версии. Для старых серверов без SFTP есть -O, для регулярной синхронизации лучше rsync.

Источники и ссылки


Комментарии загружаются…