linux ssh-network

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).

Синтаксис

scp [опции] источник назначение # источник/назначение могут быть: # локальный путь: /home/user/file.txt # удалённый путь: user@host:/remote/path/file.txt
ЧастьОписание
источникОткуда копировать: локальный путь или [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 как альтернатива для больших объёмов
При передаче множества файлов или синхронизации директорий rsync -avz значительно эффективнее scp: он передаёт только изменённые части файлов, умеет возобновлять прерванную передачу и показывает детальную статистику. scp — для разовой передачи одного-двух файлов.
Совет: пробел в путях
Пути с пробелами нужно экранировать двойным способом — и от локального shell, и от удалённого: scp user@host:"'/path with spaces/file.txt'" ./ или использовать одинарные кавычки с учётом уровней экранирования.
Осторожно: -r и символические ссылки
Флаг -r при копировании директории следует по символическим ссылкам и копирует содержимое целевых файлов, а не сами ссылки. Это может привести к передаче неожиданно большого объёма данных, если ссылки указывают за пределы директории.
Осторожно: scp устарел как протокол
В OpenSSH 9.0+ команда scp переведена на SFTP-протокол под капотом. Старый SCP-протокол имел уязвимости, позволявшие серверу записывать файлы в произвольные места. Используйте обновлённые версии OpenSSH или переходите на sftp/rsync --rsh=ssh.