Перейти к содержимому

scp — передача файлов по SSH

scp — утилита для копирования файлов по SSH поверх протокола SSH. Работает из терминала, не требует настройки сервера сверху — достаточно работающего sshd и авторизации. В эпоху rsync и bat SCP живёт как простой инструмент для разовых передач, когда не хочется возиться с daemon-ами или конфигурацией.

Синтаксис и базовые сценарии

Общий вид:

scp [флаги] источник назначение

Источник и назначение могут быть локальными путями или remote-адресами в формате user@host:path.

# Локальный файл на удалённую машину
scp ./deploy.tar.gz deploy@10.0.2.15:/opt/app/

# Удалённый файл на локальную машину
scp deploy@10.0.2.15:/opt/app/deploy.tar.gz ./

# Между двумя удалёнными хостами (через локальную машину)
scp user@host1:/data/backup.sql user@host2:/data/restore/
Подсказка

Если на удалённом хосте используется нестандартный порт SSH, указывайте его через -P (заглавная P — у scp, в отличие от ssh).

Копирование директорий рекурсивно

Для копирования директории нужен флаг -r. Без него scp откажется передавать каталог и выведет ошибку.

scp -r ./project/ dev@10.0.2.15:/home/dev/projects/
Предупреждение

При рекурсивном копировании scp передаёт содержимое директории, а не саму директорию целиком. Поведение зависит от наличия или отсутствия завершающего / в пути — проверяйте результат, если структура важна.

Полезные флаги

ФлагОписание
-rРекурсивное копирование директорий
-P portПорт SSH на удалённом хосте
-pСохраняет время модификации, доступ и права файла
-qБез прогресс-бара, тихий режим
-CСжатие данных при передаче
-i key.pemУказание приватного ключа
-o StrictHostKeyChecking=noАвтоматическое принятие нового хост-ключа
-l rateОграничение полосы пропускания в Kbit/s
scp -r -p -C -i ~/.ssh/deploy_key.pem -P 2222 ./build/ deploy@10.0.2.15:/var/www/

Типичные паттерны передачи

Развёртывание артефактов:

scp ./release.tar.gz deploy@prod:/tmp/releases/

Забрать лог с удалённого сервера:

scp admin@10.0.2.15:/var/log/app/error.log ./logs/

Массовая передача нескольких файлов:

scp config.yaml secrets.env deploy@10.0.2.15:/opt/app/

Передача между двумя серверами напрямую (источник и приёмник оба remote):

scp -3 user@host1:/data/file.csv user@host2:/data/import/

Флаг -3 перенаправляет трафик через локальную машину. Без него scp пытается установить соединение напрямую между хостами, что обычно не работает.

Ограничения и альтернативы

scp не поддерживает возобновление прерванных передач — если соединение оборвалось на середине гигабайтного файла, придётся начинать заново. Нет инкрементальной синхронизации, нет проверки контрольных сумм. Передача идёт последовательно, параллельная передача нескольких файлов не встроена.

Для повседневных задач rsync решает эти проблемы:

rsync -avz -e "ssh -p 2222" ./build/ deploy@10.0.2.15:/var/www/

rsync умеет докачивать разорванные передачи, пропускать уже скопированные файлы и работать инкрементально. Для одноразовой передачи нескольких мелких файлов scp по-прежнему удобен — меньше параметров, быстрее на входе.

Примечание

В современных дистрибутивах scp может быть обёрнут в OpenSSH-клиент. Поведение совпадает, но если заметили отличия в выводе или обработке ошибок — это нормально, реализация зависит от версии OpenSSH.