Полное практическое руководство по scp: от базового синтаксиса и типовых сценариев до нюансов OpenSSH 9.x (SFTP по умолчанию), производительности, безопасности и сравнений с sftp/rsync.
Зачем нужен scp
scp — классическая команда для защищённой передачи файлов поверх SSH. В версиях OpenSSH 9.x транспорт по умолчанию реализуется через SFTP, что делает поведение scp более предсказуемым и безопасным (исторический SCP‑протокол считался проблемным). Итог для практики:
если нужна быстрая одноразовая передача «как есть» —
scpостаётся удобным;для массовых инкрементальных синхронизаций/перезапусков лучше подходит
rsync;для интерактивной работы с деревом и тонкой настройки прав —
sftpили графические клиенты.
Важно: для обратной совместимости предусмотрен флаг
-O— включить «старый» SCP‑протокол. Используйте осознанно (см. § 8.3).
Синтаксис и топ‑опции
Общий шаблон:
scp [ОПЦИИ] [[ПОЛЬЗОВАТЕЛЬ@]ХОСТ:]/путь/источник [[ПОЛЬЗОВАТЕЛЬ@]ХОСТ:]/путь/назначение
Топ‑опции для ежедневной практики:
| Опция | Что делает | Когда применять |
|---|---|---|
-P <порт> | Подключиться к SSH на другом порту | Хост слушает, например, 2202/2224 |
-i <key> | Явно указать ключ | Несколько ключей, кастомные пути |
-r | Рекурсивно копировать каталоги | Деплой статики, бэкапы |
-p | Сохранить время/права | Логи, конфиги, артефакты сборки |
-C | Сжатие | Медленные каналы, текст/JSON |
-l <kbps> | Ограничить скорость (Кбит/с) | Не «забивать» канал |
-v / -q | Подробный / тихий режим | Отладка / скрипты |
-3 | «Реле» между двумя удалёнными через локал | Межсерверная миграция |
-O | Принудительно старый SCP‑протокол | Слетают паттерны/совместимость |
-o <SSH‑опция> | Любая SSH‑настройка | -o ProxyJump=…, -o Ciphers=… и т. д. |
Примечание:
-P— порт,-p— права/время. Не путать.
Базовые сценарии
Локал → удалённый (IPv6 + нестандартный порт)
scp -P 2224 -i ~/.ssh/id_ed25519 ./builds/report.csv \
devops@[2001:db8::10]:/srv/reports/
Удалённый → локал (сохранить метаданные)
scp -p qa@[2001:db8::20]:/var/log/app/app.log ./logs/app-qa.log
Рекурсивная загрузка каталога
scp -r ./dist/ web@203.0.113.12:/var/www/html/
Файлы с пробелами/спецсимволами
scp "./exports/Report № 7.pdf" \
ops@198.51.100.25:"/srv/docs/Report № 7.pdf"
Совет: для удалённого пути используйте кавычки на той стороне:
user@host:"/путь с пробелами".
Полезные режимы и трюки
Сжатие и лимит канала
# Сжатие + лимит до 1.2 Мбит/с
scp -C -l 1200 media.tar.gz cdn@198.51.100.7:/data/cdn/incoming/
Подробный вывод и выбор шифра (для диагностики)
scp -v -P 2202 -c aes256-ctr ./config.yml admin@203.0.113.44:/etc/myapp/
SSH‑алиасы в ~/.ssh/config
Host staging
HostName 203.0.113.44
User admin
Port 2202
IdentityFile ~/.ssh/id_ed25519
Теперь короче:
scp ./config.yml staging:/etc/myapp/
ProxyJump (bastion)
scp -o ProxyJump=bastion \
./secrets.env app.internal:/etc/myapp/
Межсерверные копии (две удалённые)
Через локальную машину (ключ -3)
scp -3 [email protected]:/var/lib/app/db.sqlite \
[email protected]:/srv/app/
Локальная машина устанавливает две SSH‑сессии и прокачивает поток через себя.
Прямой копипайп через SSH
ssh [email protected] "cat /var/lib/app/db.sqlite" \
| ssh [email protected] "cat > /srv/app/db.sqlite"
Плюсы: точный контроль, можно добавить
pv/хеш‑проверки. Минусы: ручнее, чемscp/rsync.
Производительность и надёжность
Сжатие
-Cполезно на медленных линках и для текстов (JSON/CSV/логи), но может замедлить на быстрых каналах/больших бинарниках.Лимит
-lзадаётся в Кбит/с (например,-l 1200≈ 1.2 Мбит/с), помогает не забивать канал.Мультиплексирование SSH:
Host * ControlMaster auto ControlPath ~/.ssh/cm-%r@%h:%p ControlPersist 60sПовторные
scpбудут открываться быстрее в пределах таймаута.Резюмирование/доскачка: у
scpнативного «resume» нет. Для крупных копий лучшеrsync -e ssh.
Безопасность
Ключи: используйте Ed25519 (
ssh-keygen -t ed25519), храните приватные ключи с правами600, защитите passphrase.Проверка хоста: первый коннект добавляет запись в
~/.ssh/known_hosts. Для автоматизации допустимо-o StrictHostKeyChecking=accept-new, но с пониманием рисков.Права и владельцы:
-pсохраняет метаданные; если важен владелец/группа на удалённой стороне — после копии выполнитеchown(или используйтеrsync --chown).Изоляция: для «складских» хостов выделяйте пользователя без shell‑прав (например, ограниченный
sftp‑chroot), даже если передача идётscp.
Особенности OpenSSH 9.x (важно)
SFTP по умолчанию
Современный
scpперенаправляет операции на SFTP‑подсистему. Отсюда изменения в обработке паттернов и кавычек.
Когда нужен -O
Если унаследованные скрипты полагаются на «старые» тонкости SCP‑протокола (например, удалённую интерпретацию wildcard оболочкой), для совместимости добавьте
-O. Рекомендуется рассмотреть миграцию на эквивалент через SFTP/rsync.
Паттерны и кавычки
В «старом» SCP расширение выполняла удалённая оболочка, что приводило к сюрпризам и рискам. В SFTP‑режиме поведение предсказуемее, но некоторые старые паттерны не работают. Явно экранируйте спецсимволы и используйте кавычки на удалённой стороне пути:
user@host:"/path with spaces".
Сравнение: scp vs sftp vs rsync
| Критерий | scp | sftp | rsync |
|---|---|---|---|
| Простой одноразовый перенос | Да | Да | Да |
| Рекурсивные каталоги | Да (-r) | Да | Да |
| Возобновление/инкрементальность | Нет | Частично (через команды клиента) | Да (хэш/дифф) |
| Ограничение полосы | Да (-l) | Да (через клиент) | Да (--bwlimit) |
| Сжатие «на лету» | Да (-C) | Нет (обычно) | Да (-z) |
| Массовые зеркалирования | Можно, но не лучшее | Можно, но ручнее | Лучший выбор |
| Интерактивный режим | Нет | Да | Нет |
Вывод: держите под рукой все три.
scp— коротко и быстро;sftp— интерактив и права;rsync— надёжные синхронизации.
Частые ошибки и их диагностика
Permission denied (publickey): проверьте ключ, права~/.sshи~/.ssh/authorized_keys(700/600/600), пользователя/порт.No such file or directory: проверьте путь на удалённой стороне, кавычки и права на каталог назначения.Зависания/таймауты: проверьте
-P <порт>,ufw/iptables/security group, прокси/бастион (-o ProxyJump).Медленно: уберите
-Cдля больших бинарников, проверьте MTU/VPN, попробуйте другой шифр (-c chacha20-poly1305@openssh.comилиaes128-ctr).
Мини‑шпаргалка (копипаст‑готово)
# Локал → удалённый (IPv6, порт 2224)
scp -P 2224 ./file.txt devops@[2001:db8::10]:/srv/
# Удалённый → локал с сохранением метаданных
scp -p qa@[2001:db8::20]:/var/log/app.log ./logs/
# Рекурсивно каталог
scp -r ./dist/ web@203.0.113.12:/var/www/html/
# Сжатие + лимит канала 1.2 Мбит/с
scp -C -l 1200 media.tar.gz cdn@198.51.100.7:/data/cdn/incoming/
# Межсерверная передача через локал (-3)
scp -3 [email protected]:/var/lib/app/db.sqlite \
[email protected]:/srv/app/
# Явный ключ и алиас из ~/.ssh/config
scp -i ~/.ssh/id_ed25519 ./config.yml staging:/etc/myapp/
Чек‑лист: перед и после передачи
Перед запуском
Доступ по SSH по ключу работает (
ssh user@host).Верный порт (
-P) и алиас/HostName в~/.ssh/config.Права на ключи:
~/.ssh— 700, приватный ключ — 600.Достаточно прав на каталог назначения (владение/
chmod).Путь с пробелами/Юникодом заключён в кавычки и на удалённой стороне:
user@host:"/path with spaces".Для больших текстовых данных включено сжатие
-C(при медленном канале).При необходимости ограничена полоса
-l <kbps>.Понимание версии OpenSSH: если полагаетесь на старое расширение паттернов — учтите режим
-O.
Во время копирования
Для диагностики включён
-v(при проблемах с подключением/скоростью).Через bastion используется
-o ProxyJump=или алиас с ProxyJump.При межсерверной передаче выбран корректный режим:
scp -3илиssh | sshпайп.
После копирования
Проверена целостность (при необходимости):
sha256sum/md5sumисходника и копии.Сохранены временные метки/права (
-p) или вручную приведеныchown/chmod.Для больших миграций рассмотрен переход на
rsync -e ssh(resume, диффы).Логи/вывод операции сохранены (для отчётности CI/CD).э
Заключение
scp по‑прежнему полезен: минимальный барьер входа, SSH‑безопасность, удобство в скриптах. Знайте его сильные стороны и ограничения: при больших зеркалированиях берите rsync, для интерактивных сессий — sftp. Помните про особенности OpenSSH 9.x и работайте с путями/паттернами аккуратно. Это избавит от «магии» и сделает ваши копии предсказуемыми и воспроизводимыми.