Руководство по передаче файлов командой SCP на Linux

Передача файлов между серверами — ежедневная задача админа и DevOps. scp (Secure Copy) ходит поверх SSH: шифрование, привычная аутентификация, без отдельного демона. Ниже — синтаксис, рабочие сценарии и нюансы, на которых часто спотыкаются.

Что такое SCP

SCP копирует файлы и каталоги между локальной машиной и удалённым хостом (или между двумя удалёнными). Канал — SSH, поэтому «человек посередине» и открытый FTP здесь не в приоритете. Оригинал на источнике не меняется, если вы сами его не трогаете.

Внутри протокола классически выделяют source mode (отдать файл) и sink mode (принять и записать). На практике вам достаточно помнить: слева источник, справа назначение, как у cp.

Между двумя remote-хостами scp умеет работать, но современные OpenSSH по умолчанию не всегда делают «прямой» hop: для предсказуемости и безопасности часто гонят трафик через локальную машину (флаг -3).

Синтаксис и основные опции

scp [опции] источник назначение
  • -r — рекурсивно (каталоги)
  • -P — порт SSH (именно большая P, не как у ssh -p)
  • -i — путь к приватному ключу
  • -C — сжатие на лету (помогает на текстовых данных и медленных линках)
  • -p — сохранить mtime/atime
  • -q — тихий режим
  • -v — отладка (если «висит» или падает auth)
  • -3 — между двумя remote гонять через localhost

Базовый шаблон «залить файл на сервер»:

scp file.txt user@remote_host:/path/to/dir/

Локальный файл на удалённый сервер

scp file.txt user@192.168.1.10:/home/user/
  • file.txt — что копируем
  • user@192.168.1.10 — логин и хост
  • /home/user/ — каталог назначения (должен существовать и быть доступен по правам)

Типичный прогресс:

file.txt                                     100%   12KB  1.2MB/s   00:00

Переименовать при копировании

scp file.txt user@192.168.1.10:/home/user/file_new_name.txt

Каталог целиком

scp -r folder/ user@192.168.1.10:/home/user/

Слеш в конце folder/ vs folder влияет на то, как оболочка и scp воспринимают имя, но для -r обычно копируется сама директория. Перед большой выгрузкой проверьте место: df -h на целевой стороне.

Нестандартный порт SSH

scp -P 2222 file.txt user@192.168.1.10:/home/user/

Порт должен слушать sshd, firewall и security-group должны пропускать TCP. Ошибка «Connection refused» почти всегда про это, а не про scp как таковой.

С удалённого сервера на локальную машину

scp user@192.168.1.10:/home/user/file.txt /path/on/local/

В текущий каталог:

scp user@192.168.1.10:/home/user/file.txt ./

Директория с remote:

scp -r user@192.168.1.10:/home/user/folder/ ./

Между двумя удалёнными серверами

scp user1@192.168.1.10:/path/file.txt user2@192.168.1.20:/path/dest/

Чтобы явно гнать данные через вашу локальную машину (удобно, когда серверы не видят друг друга по SSH, или не хотите полагаться на agent forwarding):

scp -3 user1@192.168.1.10:/path/file.txt user2@192.168.1.20:/path/dest/

Минус -3: весь объём проходит через ваш канал. На гигабайтах это заметно.

Ключи, сжатие, отладка

# отдельный ключ
scp -i ~/.ssh/id_deploy file.txt user@host:/var/www/

# сжатие
scp -C big.log user@host:/tmp/

# понять, где залипает
scp -v file.txt user@host:/tmp/

Для регулярных выкладок чаще удобнее rsync -avz -e ssh: докачка, исключение файлов, меньше лишнего трафика. SCP остаётся хорош для разовых «закинь конфиг / сними лог».

Безопасность и типичные грабли

  • Перезапись без вопросов. Существующий файл на цели scp перезапишет молча. Перед массовым копированием проверьте пути.
  • SSH-ключи вместо пароля в скриптах и CI. Права на ключ: chmod 600.
  • Не путайте -P и -p. Порт — большая P, сохранение timestamps — маленькая.
  • Права и SELinux/AppArmor. Файл может «приехать», но сервис его не прочитает из-за контекста или владельца.
  • Устаревший scp-протокол. В новых OpenSSH по умолчанию часто SFTP backend под капотом у scp. Поведение в основном совместимо, но при странных ошибках смотрите версию: ssh -V.

Краткий чеклист

  • Локально → remote: scp file user@host:/path/
  • Remote → локально: scp user@host:/path/file ./
  • Каталог: добавьте -r
  • Порт: -P 2222
  • Два remote и нет прямой связности: -3

SCP — быстрый и понятный инструмент для защищённой копии по SSH. Для одноразовых задач его хватает с запасом; для зеркалирования каталогов и регулярного деплоя смотрите в сторону rsync и SFTP-клиентов.

Источники и ссылки


Комментарии загружаются…