Команда scp: использование и параметры, копирование папок и указание порта
scp — это инструмент копирования для обмена файлами с сервером, к которому вы подключаетесь по SSH. При отправке файла командой scp вы, как и в cp, сначала указываете источник, а затем место назначения. Когда мы отправили файлы и папки с сервера AlmaLinux 9 на сервер Debian 12 и забрали их обратно, передача прошла по протоколу SFTP, а файл размером 20MB дошёл менее чем за 1 секунду.
Весь вывод ниже — это точный результат работы scp из OpenSSH 9.9 под учётной записью root на отправляющей стороне. На примерные значения заменены только адреса серверов и имена учётных записей.
1️⃣ Использование scp и удалённые пути
Перед путём на удалённом сервере ставится [учётная запись@адрес сервера:]. Путь без двоеточия считается путём на сервере, где вы запускаете команду, поэтому сторона с двоеточием определяет, отправляете вы или получаете.
Отправляет report.txt из текущей папки в папку scp-test в домашнем каталоге удалённого сервера.
scp report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.1KB/s 00:00По окончании передачи в одной строке выводятся имя файла, ход выполнения, размер, скорость и затраченное время. Этот индикатор появляется только при запуске в терминале. Поэтому если перенаправить вывод в файл, в файле ничего не останется.
При получении сначала укажите удалённый путь, а затем локальный путь для сохранения.
scp user@203.0.113.10:~/scp-test/report.txt ./downloads/report.txt 100% 14 2.7KB/s 00:00Если путь назначения заканчивается именем файла, а не папкой, файл сохраняется под этим именем. После отправки командой ниже в папке на принимающей стороне report.txt лежал под именем report-1028.txt.
scp report.txt user@203.0.113.10:~/scp-test/report-1028.txtreport.txt 100% 14 4.6KB/s 00:00🔲 Симулятор команды scp
В симуляторе ниже вы можете сами вводить команды отправки, получения и копирования папок и смотреть вывод для каждого параметра.
2️⃣ Параметры команды scp
Параметры пишутся сразу после scp, перед источником. -P для порта — заглавная буква, а строчная -p сохраняет время и права, поэтому если перепутать регистр, выполнится другое действие.
-l задаёт верхний предел скорости передачи в Kbit/s. Без параметров файл размером 20MB передался менее чем за 1 секунду.
scp backup.tar.gz user@203.0.113.10:~/scp-test/backup.tar.gz 100% 20MB 53.6MB/s 00:00-l 8000 соответствует примерно 1,000KB в секунду. При отправке того же файла с -l 8000 индикатор показал скорость 996.5KB/s, а передача заняла 20 секунд.
scp -l 8000 backup.tar.gz user@203.0.113.10:~/scp-test/backup-l.tar.gzbackup.tar.gz 100% 20MB 996.5KB/s 00:20-C сжимает данные в SSH-соединении тем же способом, что и gzip. Мы отправили по три раза файл журнала размером 19MB с повторяющимися предложениями, и между этими двумя серверами вариант с -C оказался немного медленнее.
| Команда | Файл | Время выполнения | Скорость на индикаторе |
|---|---|---|---|
| scp backup.tar.gz | 20MB | 0,68 с | 53.6MB/s |
| scp -l 8000 backup.tar.gz | 20MB | 20.82 с | 996.5KB/s |
| scp access.log (3 раза) | 19MB | 0.79~0.89 с | — |
| scp -C access.log (3 раза) | 19MB | 0.84~0.97 с | — |
Время выполнения — это время от запуска команды через подключение до конца передачи. В руководстве ssh тоже сказано, что сжатие помогает на медленных линиях и замедляет передачу в быстрых сетях.
-v выводит ход работы от подключения до передачи строками debug1, поэтому он нужен для поиска причины, когда подключение не удаётся или останавливается на аутентификации. Вывод длинный, поэтому мы отобрали через grep только строки аутентификации и передачи.
scp -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending subsystem: sftp
Transferred: sent 2536, received 3248 bytes, in 0.1 secondsСтрока [Sending subsystem: sftp] означает, что scp отправил файл по протоколу SFTP. Начиная с OpenSSH 9.0 scp по умолчанию использует SFTP. С -O передача идёт по старому протоколу SCP, а на том же месте появляется [Sending command: scp -v -t].
scp -O -v report.txt user@203.0.113.10:~/scp-test/ 2>&1 | grep -E 'Authenticated|Sending|Transferred'Authenticated to 203.0.113.10 ([203.0.113.10]:22) using "publickey".
debug1: Sending command: scp -v -t ~/scp-test/
Sending file modes: C0600 14 report.txt
Transferred: sent 2328, received 3036 bytes, in 0.1 seconds📌 Основные опции: результаты из этой статьи
| Опция | Назначение | Результат в этой статье | |
|---|---|---|---|
| -P | Указывает порт подключения SSH | Порт 22: передача report.txt завершена, закрытый порт 2222: завершение с [Connection timed out] | |
| -i | Указывает файл закрытого ключа для аутентификации по открытому ключу | Передача report.txt завершена с указанием ~/.ssh/id_ed25519 | |
| -r | Копирует файлы и вложенные папки в папке | На принимающей стороне папки css и images остаются в исходной структуре; без параметра передача не идёт из-за ошибки [not a regular file] | |
| -p | Сохраняет время изменения, время доступа и права источника | Время изменения сохраняется; на принимающей стороне в этой статье права 600 остались только у файла, отправленного с -O -p | |
| -C | Сжимает данные в SSH-соединении | Для журнала 19MB между двумя серверами этой статьи вариант с параметром был немного медленнее | |
| -l | Задаёт верхний предел скорости передачи в Kbit/s | С -l 8000: 20MB при 996.5KB/s, 20.82 секунды | |
| -v | Выводит ход работы от подключения до передачи строками debug1 | Передача по SFTP подтверждена строкой [Sending subsystem: sftp] | |
| -3 | Передаёт данные между двумя удалёнными серверами через сервер, на котором запущена команда (способ по умолчанию начиная с OpenSSH 8.7) | Передача report.txt завершена с двумя папками одного сервера в роли источника и назначения | |
| -O | Передаёт по старому протоколу SCP | В выводе -v появляется [Sending command: scp -v -t]; путям с пробелами нужна дополнительная обратная косая черта | |
| -o | Передаёт в ssh параметр в формате ssh_config | Ожидание задано как 10 секунд через ConnectTimeout=10, [Connection timed out] подтверждён |
📎 Другие опции: по официальному руководству
| Опция | Назначение | |
|---|---|---|
| -q | Отключает индикатор хода, а также предупреждения и диагностические сообщения ssh | |
| -J | Сначала подключается к промежуточному хосту, а оттуда настраивает TCP-перенаправление до конечного назначения (краткая форма настройки ProxyJump, несколько переходов разделяются запятыми) | |
| -F | Указывает другой файл как пользовательский файл настроек ssh (передаётся напрямую в ssh) | |
| -4 | Принудительно использует только адреса IPv4 | |
| -6 | Принудительно использует только адреса IPv6 |
3️⃣ Копирование папок через scp и сохранение времени
Если указать папку без параметров, scp выведет ошибку о том, что это не обычный файл, и не выполнит передачу.
scp site-files user@203.0.113.10:~/scp-test/scp: local "site-files" is not a regular file
scp: failed to upload file site-files to ~/scp-test/С -r копируются файлы и вложенные папки в папке.
scp -r site-files user@203.0.113.10:~/scp-test/logo.png 100% 48KB 4.7MB/s 00:00
style.css 100% 15 5.0KB/s 00:00
index.html 100% 15 5.2KB/s 00:00В выводе показаны только имена файлов. В выводе find на принимающей стороне папки css и images лежали в site-files в исходной структуре.
ssh user@203.0.113.10 'cd ~/scp-test && find site-files'site-files
site-files/images
site-files/images/logo.png
site-files/index.html
site-files/css
site-files/css/style.css-r следует по символическим ссылкам в папке и копирует исходные файлы, поэтому для папок, где ссылки должны остаться ссылками, лучше подходит rsync -a.
-p сохраняет время изменения, время доступа и права источника. Перед отправкой мы задали исходному report.txt время изменения 1 октября 2026 г. 00:00 (UTC) и права 600. Часовой пояс принимающего сервера — UTC, поэтому ls на отправляющей стороне тоже выводился с TZ=UTC.
TZ=UTC ls -l report.txt-rw------- 1 root root 14 Oct 1 00:00 report.txtscp -p report.txt user@203.0.113.10:~/scp-test/report-p.txtreport.txt 100% 14 4.7KB/s 00:00scp -O -p report.txt user@203.0.113.10:~/scp-test/report-Op.txtreport.txt 100% 14 4.2KB/s 00:00ssh user@203.0.113.10 'ls -l ~/scp-test/report.txt ~/scp-test/report-p.txt ~/scp-test/report-Op.txt'-rw------- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-Op.txt
-rw-rw-r-- 1 user user 14 Oct 1 00:00 /home/user/scp-test/report-p.txt
-rw-rw-r-- 1 user user 14 Oct 28 06:17 /home/user/scp-test/report.txtreport-p.txt, отправленный с -p, и report-Op.txt, отправленный с -O -p, сохранили исходное время, а report.txt без параметров сохранился со временем отправки. На принимающем сервере файлы, отправленные по SFTP, даже с -p получили права 664, и только файл, отправленный по старому протоколу SCP (-O), сохранил 600.
Поэтому для файлов, права которых должны совпадать с источником, после отправки проверяйте права через ls -l на принимающей стороне.
4️⃣ Указание порта и файла ключа в scp
Для серверов, к которым нельзя подключиться через стандартный порт 22 и стандартный ключ, укажите порт и ключ перед отправкой. -P указывает порт подключения SSH, а -i — файл закрытого ключа для аутентификации по открытому ключу.
Ниже пример с прямым указанием порта 22 и файла ключа. Если порт сервера изменён, напишите этот номер вместо 22.
scp -P 22 -i ~/.ssh/id_ed25519 report.txt user@203.0.113.10:~/scp-test/report.txt 100% 14 5.3KB/s 00:00Без -i, как и ssh, команда по очереди использует ключи со стандартными именами в ~/.ssh (id_rsa, id_ecdsa, id_ed25519 и т. д.).
Если вы часто отправляете файлы на один и тот же сервер, запишите псевдоним в ~/.ssh/config и вводите в scp только его.
Host myserver
HostName 203.0.113.10
User user
Port 22
IdentityFile ~/.ssh/id_ed25519Имя в строке Host становится псевдонимом, а четыре строки под ней заменяют адрес сервера, учётную запись, порт и файл ключа. Команда с одним псевдонимом завершилась тем же результатом в одну строку, что и с полным адресом и ключом.
scp report.txt myserver:~/scp-test/report.txt 100% 14 4.2KB/s 00:00-P, -i и псевдонимы используют настройки подключения ssh без изменений, поэтому создание ключа и его регистрация на сервере проходят так же, как при подключении через команду SSH.
5️⃣ Копирование между серверами через scp
Даже когда и источник, и назначение — удалённые серверы, хватит одной строки scp. Начиная с OpenSSH 8.7 данные передаются через сервер, на котором запущена команда, и этот способ — -3. В официальных примечаниях к выпуску причиной смены способа по умолчанию названо то, что учётные данные сервера назначения не нужно хранить на сервере-источнике.
Замер ниже выполнен с двумя папками одного сервера в роли источника и назначения. Если сервер назначения другой, измените только учётную запись и адрес в конце.
scp -3 user@203.0.113.10:~/scp-test/report.txt user@203.0.113.10:~/scp-test/copy3/report.txt 100% 14 2.5KB/s 00:00Это похоже на то, как головной офис принимает документы между двумя филиалами и пересылает их дальше.
Прежний способ, при котором сервер-источник отправляет данные напрямую серверу назначения, задаётся через -R. Для него сервер-источник должен подключаться к серверу назначения без пароля. Начиная с OpenSSH 10.6 при использовании -R появляется предупреждение о прекращении поддержки, а в следующих версиях этот параметр планируется игнорировать и копировать способом -3.
6️⃣ Сравнение scp и rsync
Для разовой отправки нескольких файлов достаточно scp, а для регулярной синхронизации одной и той же папки или возобновления прерванной передачи лучше подходит команда rsync. scp при каждом запуске заново отправляет все указанные файлы, а rsync сравнивает источник с назначением и передаёт только изменённые файлы.
| Параметр | scp | rsync |
|---|---|---|
| Объём передачи | Все указанные файлы при каждом запуске | Только файлы, изменённые относительно источника |
| Сохранение недополученных файлов (--partial) | ❌ | ✅ |
| Удаление файлов, которых нет в источнике (--delete) | ❌ | ✅ |
| Символические ссылки | Следует по ним и копирует файлы | С -a остаются ссылками |
| Нужно на принимающей стороне | Доступ по SSH и сервер SFTP | rsync установлен с обеих сторон |
7️⃣ Сообщения об ошибках команды scp и их решение
Когда scp завершается ошибкой, причина сразу видна в первой строке вывода. Во всех трёх случаях, когда мы намеренно вызвали ошибки отсутствующим файлом, правами на запись и неверным портом, причина была в первой строке, а код выхода каждый раз отличался от 0.
🔲 No such file or directory
Если попытаться получить файл, которого нет на удалённой стороне, вместе с путём выводится [No such file or directory].
scp user@203.0.113.10:~/scp-test/nofile.txt ./downloads/scp: ~/scp-test/nofile.txt: No such file or directoryПри отправке та же ошибка появляется, если нет папки назначения. scp не создаёт отсутствующие папки, поэтому сначала выполните через ssh mkdir -p и создайте папку.
scp report.txt user@203.0.113.10:~/scp-test/nodir/sub/scp: dest open "scp-test/nodir/sub/": No such file or directory
scp: failed to upload file report.txt to ~/scp-test/nodir/sub/🔲 Permission denied
Если у папки на принимающей стороне нет права на запись, после [dest open] следует [Permission denied]. Ниже результат отправки в папку readonly с правами 555.
scp report.txt user@203.0.113.10:~/scp-test/readonly/scp: dest open "scp-test/readonly/report.txt": Permission denied
scp: failed to upload file report.txt to ~/scp-test/readonly/Если перед [Permission denied] стоит [учётная запись@адрес сервера:], а в скобках указан способ аутентификации вроде publickey, соединение отклонено на этапе аутентификации. Такой текст программа ssh выводит при неудачной аутентификации, поэтому сначала проверьте файл ключа, указанный через -i, и открытый ключ, зарегистрированный на сервере.
🔲 Connection timed out
Если номер порта неверен или брандмауэр блокирует этот порт и ответа нет, scp ждёт подключения и завершается с [Connection timed out]. Ниже результат отправки на закрытый порт 2222 с ожиданием 10 секунд.
scp -P 2222 -o ConnectTimeout=10 report.txt user@203.0.113.10:~/scp-test/ssh: connect to host 203.0.113.10 port 2222: Connection timed out
scp: Connection closedПри этой ошибке сначала проверьте, совпадает ли номер в -P с SSH-портом сервера.
🔲 Пробелы и тильда (~) в путях
В нынешнем scp, который передаёт данные по SFTP, удалённый путь с пробелами достаточно один раз заключить в одинарные кавычки.
scp report.txt 'user@203.0.113.10:~/scp-test/my files/'report.txt 100% 14 4.7KB/s 00:00Когда мы добавили -O к той же команде и отправили по старому протоколу SCP, команда завершилась ошибкой [ambiguous target]. Дело в том, что в старом протоколе SCP удалённая оболочка разбирает путь ещё раз.
scp -O report.txt 'user@203.0.113.10:~/scp-test/my files/'scp: ambiguous targetВ этом случае поставьте обратную косую черту перед пробелом, чтобы и удалённая оболочка прочитала его как одно слово.
scp -O report.txt 'user@203.0.113.10:~/scp-test/my\ files/'report.txt 100% 14 4.5KB/s 00:00Если путь после двоеточия начинается без косой черты и тильды, он считается относительно домашней папки удалённой учётной записи.
scp report.txt user@203.0.113.10:scp-test/report-rel.txtreport.txt 100% 14 5.6KB/s 00:00В официальном руководстве сказано использовать -O, когда старый сервер SFTP не может преобразовать путь с тильдой в домашнюю папку. В этом случае путь относительно домашней папки без тильды, как выше, тоже сохранит файл в том же месте.
🔢 FAQ & рекомендуемые материалы











ℹ️ О партнёрских ссылках
Материалы этого сайта содержат партнёрские ссылки. Если посетитель покупает товар или услугу по такой ссылке, сайт получает комиссию от продавца. При этом сумма, которую платит покупатель (при акционных скидках сумма снижается ↓), не увеличивается. Указанные цены, скидки и наличие актуальны на момент написания и могут отличаться, поэтому перед покупкой уточняйте их у продавца. Товары выбираются и оцениваются по нашим собственным критериям, а комиссия не влияет ни на порядок, ни на содержание обзоров.