opened image

SCP профессиональное руководство

Полное практическое руководство по 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

Критерийscpsftprsync
Простой одноразовый переносДаДаДа
Рекурсивные каталогиДа (-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 и работайте с путями/паттернами аккуратно. Это избавит от «магии» и сделает ваши копии предсказуемыми и воспроизводимыми.