Принцип работы
SCP использует для передачи данных протокол SSH (Secure Shell), который шифрует трафик, и работает поверх него.
Перед началом копирования между локальным компьютером и удалённым сервером устанавливается зашифрованное SSH-соединение. Для аутентификации можно использовать пароль или ключ SSH
- Установка SSH-соединения. scp (сам являясь тонкой оберткой) запускает стандартное SSH-подключение к удалённому хосту - тот же handshake, что при обычном
ssh: TCP-соединение, обмен ключами (key exchange), выбор шифра и MAC, аутентификация клиента (по ключу, паролю, agent forwarding и т.д.) - Запуск удалённой команды через тот же ssh-канал. Вместо интерактивной shell-сессии SSH-клиент просит сервер выполнить конкретную команду. Именно здесь начинаются различия в зависимости от того, какой протокол передачи используется под капотом - legacy SCP или SFTP
- Передача данных идёт через тот же зашифрованный SSH-канал (тот самый TCP-поток), никакого отдельного порта для данных не открывается - в отличие от активного FTP, где данные и управление идут по разным соединениям
- Завершение - по окончании передачи закрывается 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/ - директория (в данном примере), в которую будет скопирован файл
Нюансы
- SCP перезаписывает файл без предупреждения
- Если путь на удалённой стороне содержит пробел, scp требует тройного экранирования - экранировать нужно и для локального шелла, и для того, что уйдёт на сервер
- scp user@host:'/path/with\ space/file.txt' ./
- Раскрытие
*делает шелл на сервере, а не на локальной машине. Если у пользователя на сервере нестандартный shell (не bash) или ограниченный shell (rbash, ForceCommand), wildcard может не раскрыться вообще или раскрыться иначе - В отличие от rsync, при разрыве соединения на середине передачи большого файла scp начинает копирование с нуля. Нет флага для докачки
- Начиная с OpenSSH 9.0, scp по умолчанию использует SFTP-протокол вместо legacy SCP-протокола под капотом. Это меняет поведение в деталях - например, wildcard-раскрытие путей на сервере может работать иначе, и некоторые старые трюки (типа копирования через нестандартные shell-конструкции) перестают работать
- scp user1@host1:/file user2@host2:/path/
- Копирование между двумя удалёнными хостами по умолчанию не проходит через клиента. Данные идут напрямую 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
Рекурсивное копирование директорий
Без-rscp откажется копировать директорию и выдаст ошибку. Копирует всё содержимое рекурсивно, включая поддиректории
- 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/
Комментарии
Пока нет комментариев. Будьте первым!
Оставить комментарий