scp
Безопасное копирование файлов между локальной машиной и сервером по SSH
Описание
scp (Secure Copy Protocol) — утилита для копирования файлов и директорий между хостами с использованием SSH в качестве транспорта. Команда работает аналогично обычному cp, но вместо локальных путей принимает удалённые адреса в формате пользователь@хост:путь. Весь трафик шифруется, аутентификация использует те же механизмы, что и ssh (пароль или ключи).
scp появилась как часть пакета OpenSSH и с 1990-х годов была стандартным способом передачи файлов по SSH. Важно знать: начиная с OpenSSH 9.0 (2022) scp по умолчанию использует протокол SFTP под капотом вместо устаревшего SCP-протокола. Для сценариев, требующих максимальной производительности при передаче большого числа файлов, рекомендуется рассмотреть rsync, а для интерактивной работы с файловой системой сервера — sftp.
Типичные сценарии использования: загрузить конфиг на сервер, скачать логи для анализа, скопировать артефакты сборки, передать ключи или сертификаты. Одна из особенностей — scp умеет копировать напрямую между двумя удалёнными серверами, не проходя через локальную машину (режим server-to-server).
Синтаксис
| Часть | Описание |
|---|---|
| источник | Откуда копировать: локальный путь или [user@]host:path |
| назначение | Куда копировать: локальный путь или [user@]host:path |
| user@host: | Если пользователь не указан, используется текущий локальный |
| :path | Путь на удалённой стороне; если не указан — домашняя директория |
Флаги и опции
| Флаг | Описание |
|---|---|
| -r | Рекурсивное копирование директорий (обязательно для папок) |
| -p | Сохранить временные метки, права доступа и владельца (preserve) |
| -P PORT | Подключиться на нестандартный порт SSH (заглавная P, в отличие от ssh) |
| -i KEYFILE | Использовать указанный приватный ключ для аутентификации |
| -C | Включить сжатие данных при передаче (полезно для текстовых файлов) |
| -l LIMIT | Ограничить скорость передачи в Кбит/с (bandwidth limit) |
| -q | Тихий режим: не показывать прогресс и предупреждения |
| -v | Режим отладки: показать подробный вывод процесса подключения |
| -3 | Копировать между двумя удалёнными хостами через локальную машину (без прямого соединения между ними) |
| -o Option=Value | Передать SSH-параметр напрямую, напр. -o StrictHostKeyChecking=no |
| -F configfile | Использовать нестандартный файл конфигурации SSH вместо ~/.ssh/config |
Паттерны использования
Загрузить файл на сервер
Скопировать локальный файл в директорию на удалённом хосте.
# Один файл scp ./config.yml deploy@server:/etc/myapp/config.yml # Несколько файлов (glob) scp ./dist/*.js deploy@server:/var/www/app/ # Нестандартный порт scp -P 2222 ./app.tar.gz ubuntu@myhost:/tmp/
Скачать файл с сервера
Получить файл или директорию с удалённого хоста.
# Скачать лог scp user@server:/var/log/nginx/access.log ./logs/ # Скачать директорию рекурсивно scp -r user@server:/var/backups/db/ ./local-backups/ # С сохранением прав scp -p user@server:/etc/app.conf ./
Копирование с ключом
Аутентификация по ключевой паре для CI/CD и автоматизации.
# Явно указать ключ
scp -i ~/.ssh/prod_key.pem \
./release.tar.gz \
ec2-user@54.12.34.56:/srv/app/
# Через псевдоним из ~/.ssh/config
# (ключ подхватится автоматически)
scp ./config.env prod:/etc/app/
Копирование директории с архивированием
Паттерн: упаковать локально, передать, распаковать на сервере.
# Упаковать и передать
tar czf - ./dist/ | ssh user@server \
"tar xzf - -C /var/www/app/"
# Или напрямую через scp
scp -r -C ./dist/ user@server:/var/www/app/
Между двумя удалёнными серверами
Скопировать файлы напрямую с одного сервера на другой.
# Прямое соединение server1 → server2
# (требует доступа server1 к server2)
scp user@server1:/data/dump.sql \
user@server2:/imports/
# Через локальную машину (флаг -3)
scp -3 user@server1:/data/file.tar \
user@server2:/data/
Ограничение скорости передачи
Не перегружать канал при передаче больших файлов.
# Ограничить до 1 Мбит/с scp -l 1000 bigfile.tar.gz user@server:/tmp/ # Показать прогресс (по умолчанию включён) scp -v largefile.iso user@server:/srv/ # Тихий режим для скриптов scp -q ./config.yml user@server:/etc/app/
Советы и предупреждения
При передаче множества файлов или синхронизации директорий
rsync -avz значительно эффективнее scp: он передаёт только изменённые части файлов, умеет возобновлять прерванную передачу и показывает детальную статистику. scp — для разовой передачи одного-двух файлов.
Пути с пробелами нужно экранировать двойным способом — и от локального shell, и от удалённого:
scp user@host:"'/path with spaces/file.txt'" ./ или использовать одинарные кавычки с учётом уровней экранирования.
Флаг
-r при копировании директории следует по символическим ссылкам и копирует содержимое целевых файлов, а не сами ссылки. Это может привести к передаче неожиданно большого объёма данных, если ссылки указывают за пределы директории.
В OpenSSH 9.0+ команда scp переведена на SFTP-протокол под капотом. Старый SCP-протокол имел уязвимости, позволявшие серверу записывать файлы в произвольные места. Используйте обновлённые версии OpenSSH или переходите на
sftp/rsync --rsh=ssh.