Если у вас есть домашний сервер или сервер в интернете, то вам понадобится способ для безопасного перемещения файлов между машинами. Между локальными машинами мы могли бы просто переносить данные с помощью флешки, но на удаленный сервер нужно передавать данные только через сеть. Есть много способов реализации этой задачи.
В этой статье мы рассмотрим как выполняется копирование файлов с помощью утилиты 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 один из таких инструментов.
блин, а если порт не 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