SCP - копируем файлы между серверами

SCP - копируем файлы между серверами

Принцип работы

SCP использует для передачи данных протокол SSH (Secure Shell), который шифрует трафик, и работает поверх него.
Перед началом копирования между локальным компьютером и удалённым сервером устанавливается зашифрованное SSH-соединение. Для аутентификации можно использовать пароль или ключ SSH

  1. Установка SSH-соединения. scp (сам являясь тонкой оберткой) запускает стандартное SSH-подключение к удалённому хосту - тот же handshake, что при обычном ssh: TCP-соединение, обмен ключами (key exchange), выбор шифра и MAC, аутентификация клиента (по ключу, паролю, agent forwarding и т.д.)
  2. Запуск удалённой команды через тот же ssh-канал. Вместо интерактивной shell-сессии SSH-клиент просит сервер выполнить конкретную команду. Именно здесь начинаются различия в зависимости от того, какой протокол передачи используется под капотом - legacy SCP или SFTP
  3. Передача данных идёт через тот же зашифрованный SSH-канал (тот самый TCP-поток), никакого отдельного порта для данных не открывается - в отличие от активного FTP, где данные и управление идут по разным соединениям
  4. Завершение - по окончании передачи закрывается ssh-сессия

Синтаксис

scp [опции] источник назначение

Удаленный сервер указывается в формате:
IP_или_DOMAIN:/path/to/file

Например:
- scp root@192.168.1.29:/root/nginx-redis-chart-0.1.0.tgz /share/
- root@192.168.1.29 - пользователь и IP-адрес удаленного сервера
- /root/nginx-redis-chart-0.1.0.tgz - файл, который надо скопировать
- /share/ - директория (в данном примере), в которую будет скопирован файл
- scp /home/user/file.txt root@192.168.1.29:/share/
- /home/user/file.txt - файл, который надо скопировать
- root@192.168.1.29 - пользователь и IP-адрес удаленного сервера
- /share/ - директория (в данном примере), в которую будет скопирован файл

Нюансы

  1. SCP перезаписывает файл без предупреждения
  2. Если путь на удалённой стороне содержит пробел, scp требует тройного экранирования - экранировать нужно и для локального шелла, и для того, что уйдёт на сервер
    • scp user@host:'/path/with\ space/file.txt' ./
  3. Раскрытие * делает шелл на сервере, а не на локальной машине. Если у пользователя на сервере нестандартный shell (не bash) или ограниченный shell (rbash, ForceCommand), wildcard может не раскрыться вообще или раскрыться иначе
  4. В отличие от rsync, при разрыве соединения на середине передачи большого файла scp начинает копирование с нуля. Нет флага для докачки
  5. Начиная с OpenSSH 9.0, scp по умолчанию использует SFTP-протокол вместо legacy SCP-протокола под капотом. Это меняет поведение в деталях - например, wildcard-раскрытие путей на сервере может работать иначе, и некоторые старые трюки (типа копирования через нестандартные shell-конструкции) перестают работать
    • scp user1@host1:/file user2@host2:/path/
  6. Копирование между двумя удалёнными хостами по умолчанию не проходит через клиента. Данные идут напрямую host1 → host2 (если это возможно по сети), а не через машину, откуда запущена команда

Ключи

-3

Копирование через промежуточный хост - машину, с которой запущена утилита SCP
Полезно, когда host1 и host2 не имеют прямого сетевого доступа друг к другу, но оба доступны с локальной машины

  • scp -3 user1@host1:/path/file.txt user2@host2:/path/

-4

Принудительное использование протокола IPv4
Нужно, если DNS резолвит хост и в IPv4, и в IPv6, а IPv6-соединение до сервера не работает или работает нестабильно

  • scp -4 file.txt user@domain:/tmp/

-6

Принудительное использование протокола IPv6
Нужно, если DNS резолвит хост и в IPv4, и в IPv6, а IPv4-соединение до сервера не работает или работает нестабильно

  • scp -6 file.txt user@domain:/tmp/

-B

Batch mode - отключает запрос пароля/passphrase, работает в неинтерактивном режиме. Если аутентификация не пройдёт автоматически (по ключу), scp просто завершится с ошибкой, а не будет ждать ввода
Используется в скриптах и cron-задачах, где никто не сидит рядом с терминалом, чтобы ввести пароль

  • scp -B -i ~/.ssh/id_rsa file.txt user@host:/tmp/

-C

Включить сжатие данных (передаёт -C в ssh, тот же алгоритм compression, что и в обычном ssh)
Ускоряет передачу на медленных каналах для сжимаемых данных (текст, логи). Для уже сжатых файлов (архивы, видео, изображения) эффекта почти нет, а CPU тратится зря

  • scp -C bigfile.tar user@host:/backup/

-c [шифр]

Выбор шифра для соединения (передаётся в ssh как -c)
Список доступных шифров можно посмотреть через ssh -Q cipher. Раньше это имело смысл для баланса скорость/безопасность на слабом железе, сейчас редко нужно - современные шифры типа chacha20-poly1305 или aes128-gcm быстрые сами по себе

  • scp -c aes128-gcm@openssh.com file.txt user@host:/tmp/

-F [конфиг-файл SSH]

Указывает альтернативный конфиг-файл ssh вместо ~/.ssh/config
Удобно, когда нужны разные наборы настроек (разные Jump-хосты, ключи, порты) для разных контекстов - например, рабочий и личный

  • scp -F ~/.ssh/config_work file.txt user@host:/tmp/

-i [приватный SSH-ключ]

Путь к приватному ключу для аутентификации
Если не указать, ssh использует ключи по умолчанию (id_rsa, id_ed25519 и т.д.) из ~/.ssh/. Нужен, когда ключ лежит в нестандартном месте или используется отдельный ключ под конкретный сервер

  • scp -i ~/.ssh/id_ed25519 file.txt user@host:/tmp/

-J [адрес прокси-сервера]

Jump host - прокси-сервер, через который устанавливается ssh-туннель до конечного хоста (аналог ProxyJump)
Классический сценарий: внутренний сервер недоступен из интернета напрямую, но доступен через bastion/jump-хост. В отличие от -3, здесь данные всё равно идут "сквозь" jump-хост как через туннель, а не копируются им как промежуточным участником

  • scp -J jumpuser@bastion.example.com file.txt user@internal-host:/tmp/

-l [скорость в килобитах]

Ограничение скорости передачи в Kbit/s
Здесь 800 Kbit/s ≈ 100 KB/s. Полезно, чтобы не забить весь канал при копировании большого файла на продакшн-сервере, который сейчас обслуживает живой трафик

  • scp -l 800 bigfile.iso user@host:/tmp/

-o [SSH-параметр]

Передать произвольную опцию ssh в формате key=value (как в ssh_config)

  • scp -o StrictHostKeyChecking=no -o ConnectTimeout=5 file.txt user@host:/tmp/

-P [порт]

Порт SSH-сервера на удалённой машине (по умолчанию 22)

  • scp -P 2222 file.txt user@host:/tmp/

-p

Сохраняет modification time, access time и права доступа (permissions) файла при копировании
Без -p файл на новом месте получит текущее время создания и права по umask получателя. С -p сохранятся оригинальные метаданные - важно для бэкапов, деплоя скриптов, где права/время имеют значение

  • scp -p script.sh user@host:/usr/local/bin/

-q

Quiet mode - отключает индикатор прогресса и большинство сообщений (кроме ошибок)
Удобно в скриптах, где прогресс-бар только мусорит вывод/логи

  • scp -q file.txt user@host:/tmp/

-r

Рекурсивное копирование директорий
Без -r scp откажется копировать директорию и выдаст ошибку. Копирует всё содержимое рекурсивно, включая поддиректории

  • scp -r ./project user@host:/var/www/

-S [программа]

Программа для установки шифрованного соединения вместо стандартного ssh (должна понимать те же флаги, что и ssh)
Редко используется на практике - разве что для отладки через обёртку-скрипт, которая логирует вызовы, или для использования альтернативной ssh-реализации

  • scp -S /usr/bin/ssh file.txt user@host:/tmp/

-T

Отключает проверку совпадения имён файлов между тем, что запросил клиент, и тем, что вернул сервер (strict filename checking)
Нужен в редких случаях - например, когда путь на сервере содержит спецсимволы или wildcard-раскрытие на удалённой стороне даёт результат, который стандартная проверка ошибочно блокирует. Ослабляет защиту

  • scp -T user@host:/some/weird/*.log ./

-v

Verbose - подробный вывод отладочной информации о процессе соединения и передачи (согласование ssh, аутентификация, шифр и т.д.)
Покажет, где именно происходит зависание или отказ (DNS, TCP, аутентификация, permission denied на удалённой стороне и т.п.)

  • scp -v file.txt user@host:/tmp/
#linux#гайд

Комментарии

Пока нет комментариев. Будьте первым!

Оставить комментарий

Комментарий появится после проверки модератором.