Если у вас есть домашний сервер или сервер в интернете, то вам понадобится способ для безопасного перемещения файлов между машинами. Между локальными машинами мы могли бы просто переносить данные с помощью флешки, но на удаленный сервер нужно передавать данные только через сеть. Есть много способов реализации этой задачи.
В этой статье мы рассмотрим как выполняется копирование файлов с помощью утилиты scp (Secure Copy Command), а также что из себя представляет команда Linux scp. При передаче файлы шифруются, так что больше никто не сможет получить к ним доступ и самое интересное, что вам не нужно настраивать FTP или другое дополнительное программное обеспечение. Будет достаточно сервера SSH.
Содержание статьи
Что такое SCP?
Команда scp - это утилита, которая работает по протоколу SSH, а значит, все что вам нужно для передачи файла на компьютер, это чтобы на нем был запущен SSH сервер, а также вы должны знать логин и пароль для подключения к нему. С помощью команды scp вы можете не только перемещать файлы между локальной и удаленной системой, но и между двумя удаленными системами. Для этого тоже будет достаточно знать пароли от них. И в отличие от Rsync вам не нужно авторизоваться на одном из серверов.
Копирование файлов scp
Эта статья рассчитана в первую очередь на начинающих, поэтому я попытаюсь объяснять все как можно подробнее. Перед тем, как мы перейдем к практике, нужно рассмотреть общий синтаксис команды:
$ scp опции пользователь1@хост1:файл пользователь2@хост2:файл
Опции утилиты больше касаются протокола SSH и настраивают общее ее поведение. Дальше следует адрес первого и второго файла. Каждый из них может быть расположен как на локальной, так и на удаленной машине. А теперь рассмотрим основные опции, которые могут нам понадобиться:
- -1 - использовать протокол SSH1;
- -2 - использовать протокол SSH2;
- -B - пакетный режим для передачи нескольких файлов;
- -C - включить сжатие;
- - l - установить ограничение скорости в кбит/сек;
- -o - задать нужную опцию SSH;
- -p - сохранять время модификации;
- -r - рекурсивное копирование директорий;
- -v - более подробный режим.
scp /home/sergiy/file root@losst.pro:/root/
В качестве пользователя нужно использовать любого пользователя, который есть на сервере. Вместо IP вы можете также домен сервера. Только необходимо, чтобы у выбранного пользователя были права записи в указанную папку.
С помощью опции -r вы можете скопировать на удаленную машину целый каталог. Команда будет выглядеть вот так:
scp -r /home/sergiy/photos root@losst.pro:/root/
Убедитесь, что у исходного каталога нет косой черты, а у каталога назначения она должна обязательно быть. Немного изменив синтаксис с косой чертой можно передать все файлы из каталога на удаленный сервер:
scp -r /home/sergiy/photos/* root@losst.pro:/root/
Если поменять местами локальный путь и сервер, то вы сможете копировать файлы scp c удаленного сервера на локальный компьютер:
scp root@losst.pro:/root/file /home/sergiy/
Таким же самым образом вы можете копирование файлов scp или папок с сервера:
scp -r root@losst.pro:/root/photos /home/sergiy/
Обратите внимание, что папка, в которую вы собираетесь копировать должна завершаться косой чертой, иначе папка, которую вы копируете запишется вместо той, в которую нужно скопировать.
Чтобы скачать файл scp из одного сервера на другой, просто необходимо указать данные аутентификации на каждом из них. Например, скопируем один файл:
scp root@losst.pro:/home/root/index.html root@losst.pro:/home/root/www/
Скопируем папку с того же удаленного сервера:
scp root@losst.pro:/root/photos root@losst.pro:/home/root/www/
Выводы
В этой статье мы рассмотрели как выполняется передача файлов scp, как это работает и что вы можете сделать с помощью этой утилиты. Как вы видите, перемещать файлы с одного сервера на другой очень просто. В Linux достаточно понять основы чтобы начать работать эффективнее! А команда scp один из таких инструментов.
Anubis – это максимально легкое open-source решение, созданное специально для защиты небольших веб-ресурсов от бесконечного потока запросов от ботов и AI парсеров. Этот инструмент можно считать "ядерным вариантом", потому что он заставляет ботов выполнять вычисления похожие на майнинг криптовалюты. Но это неплохая альтернатива для тех, кто не может или не хочет использовать Cloudflare. Посмотреть детали








блин, а если порт не 22 то че...(
scp -P NNNN user@server
а почему в описании команды описание опций два раза повторяются?
-1 - использовать протокол SSH1;
-2 - использовать протокол SSH2;
-B - пакетный режим для передачи нескольких файлов;
-C - включить сжатие;
- l - установить ограничение скорости в кбит/сек;
-o - задать нужную опцию SSH;
-p - сохранять время модификации;
-r - рекурсивное копирование директорий;
-v - более подробный режим.
И почему не указана опция -Р для порта, отличного от 22 ?
Копирую с одного удаленного хоста на другой. На исходном ssh работает на 22-м порту, на целевом хосте - на альтернативном.
Т.е. получается такая строка:
scp user@192.168.3.33:/path/file -P 2222 user@192.168.4.33:/path/file
При этом получаю сообщение: ssh: connect to host 192.168.4.33 port 22: Network is unreachable
Т.е. опция выбора порта не срабатывает... Как сделать, чтобы сработало?
Сначала -P а потом уже хост.
Если ты с 192.168.3.33 хочешь на 192.168.4.33 залить, то тебе надо зайти по SSH на 192.168.3.33
$ ssh root@192.168.3.33
$ cd /path/
$ scp -P 2222 file user@192.168.4.33:/path
А можно ли не копировать а перемещаться(скопировать с сервера и на нём же удалить) ?
А то не хочется сначала копировать, а потом удалять на сервере. Что то типа mv только для этой темы...
Кто знает скрипт для того, чтобы копирование происходило автоматиески с хоста в определенное время?
cron же, ну что вы. В терминале crontab -e, добавьте строку для задания и всё работает.
Этого недостаточно.
Ведь там же потребует пароль при вводе
А в этом уже поможет утилита sshpass
Добрый день! объясните в чем проблема?
Я понимаю, что в ключах но как мне подсоединить их к локальной машине или я что то не то?
root@ip-172-31-47-98:/home/ubuntu# scp /users/desktop/webapp.7z root@18.185.120.144:/home/
root@18.185.120.144: Permission denied (publickey).
lost connection
Погуглите ssh без пароля .. вот прям первая ссылка даст вполне вразумительный ответ.
"Обратите внимание, что папка, в которую вы собираетесь копировать должна завершаться косой чертой, иначе папка, которую вы копируете запишется вместо той, в которую нужно скопировать." - не увидел влияние слеша на процесс копирования (CentOS 8) - что с ним, что без него папка-источник целиком помещается в папку назначения без затирания папки назначения, либо каких бы то ни было файлов в ней. Это из-за различий в используемых дистрибутивах?
Кто-то пробовал через scp реализовать примерно следующее?
На одном сервере происходит обновление некоего файла, к примеру сертификата.
После этого нужно скопировать файл на другой сервер.
На исходном сервере сгенерирован ключ для ssh с помощью ssh-keygen.
Команда вида
scp -i /etc/letsencrypt/live/example.org/fullchain.pem user@webserver:/home/user/ssl/example.org
отрабатывает успешно
Но если указать команду в виде
scp -i /etc/letsencrypt/live/example.org/fullchain.pem user@webserver:/etc/letsencrypt/live/example.org
то получаем
Permission denied
В принципе логично.
На целевом сервере (Ubuntu) используется механизм sudo. А ключ для ssh сгенерирован для текущего пользователя.
Если генирировать через команду sudo ssh-keygen, то ключ будет для пользователя root. Но как такового пользователя нет в системе, и в команде его не использовать.
Как-то можно с помощью scp использовать sudo для того, чтобы положить файлы в системные каталоги?
Наверное лучше всего смотреть на следующий вариант:
1. Копируем файлы с помощью scp
sudo scp /etc/letsencrypt/live/example.org/fullchain.pem user@webserver:/home/user/ssl/example.org/
2. Настраиваем беспарольный доступ на sudo пользователю с помощью visudo (тут можно тонко выбрать разрешения, в общем поиграться)
3. Используем команду вида
sudo ssh user@webserver sudo cp /home/user/ssl/example.org/fullchain.pem /etc/ssl/example.org/
Как то примерно так.
Можно еще настроить через rsync, тоже с настройкой разрешений через visudo, но не стал пробовать.
Хочется обойтись минимумом ПО.
а как скопировать файл с сервера по ключу на мою машину?
Доброго дня. Не подскажете, как быть с каталогом с пробелом? Копирую из home/pc/Рабочий стол/IN. Должно помочь экранирование, но выдает No such file or directory.
Можно ещё взять в кавычки, должно работать.
scp -i 'путь_к_приватному_ключу' 'путь_к_файлу_или_директории' 'имя_пользователя'@'ip_сервера'
Доброго дня. А не подскажите как скопировать файлы с локального компьютера (MacBook) на удаленный сервер, если я через VPN и ssh зашел с локального на этот сервер.
Пробовал так:
scp /Users/ivan/Desktop/TEST/Agama-master.zip akosobok@lux-1:/home/ivan/111/Agama-master.zip
Но все время не находит на локальном компе исходные файлы
scp: /Users/ivan/Desktop/TEST/Agama-master.zip: No such file or directory
Уже все варианты испробовал...(
Команда выполняется на локальном компьютере? Файл по этому пути существует?
Нет. Получается, что я в терминале по ssh зашел на удаленный сервер и там пытаюсь выполнить команду. Естественно она не видит файлов на локальном компе. Наверное надо выполнять команду в терминале, не заходя на удаленный сервер.
Файл существует
Что-то не появляются мои ответы 🙁
Спасибо большое! После выполнения команды в локальном терминале, все получилось 🙂
А как скопировать несколько файлов, указав путь к ним и так чтобы каждый файл в свое назначение, при этом только один раз авторизовавшись (одной командой)?
Добрый день. Я наверное белая ворона: у меня никак файл с сервера ubuntu не копируется на локальный компьютер под управлением win10pro. Пользователь и там и там одинаковый и пароль одинаковый.
Пытаюсь скопировать по SSH. Сначала баз sudo потом с ним. Но толку от этого нет. Вот команда и ошибка:
isaev@osrm:~$ scp isaev@192.168.0.213:/home/isaev/ f:/isaev/
isaev@192.168.0.213's password:
ssh: Could not resolve hostname f: Temporary failure in name resolution
lost connection
isaev@osrm:~$ sudo scp isaev@192.168.0.213:/home/isaev/ f:/isaev/
[sudo] password for isaev:
The authenticity of host '192.168.0.213 (192.168.0.213)' can't be established.
ECDSA key fingerprint is SHA256:4GjSba06coOLylWIjaoGmNiAi31i8Bw5u2uYPMjjb8o.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '192.168.0.213' (ECDSA) to the list of known hosts.
isaev@192.168.0.213's password:
ssh: Could not resolve hostname f: Temporary failure in name resolution
lost connection
isaev@osrm:~$
Скажите пожалуйста, что не так?
Как скопировать 1 файл на другую машину, в разные папки юзерам?
scp /home/user/Desktop/1.txt root@host:/home/*/Desktop/
scp ambiguous target
А этим способом можно с ПК преподавателя сразу на все студенческие машины скинуть файл?
При попытке скопировать файл командой:
scp -o HostKeyAlgorithms=+ssh-rsa filename root@37.35.42.99:/root/bin/
выдаёт следующее:
sh: /usr/lib/openssh/sftp-server: not found
scp: Connection closed
По ssh зайти на этот узел могу. sftp-server находится именно по этому пцти /usr/lib/openssh/sftp-server.
Подскажите, в чём может быть проблема.
vbOracle под виндой, гостевая вм linux mint 22