Главная >> Команды >> Копирование файлов scp

Копирование файлов scp

Если у вас есть домашний сервер или сервер в интернете, то вам понадобится способ для безопасного перемещения файлов между машинами. Между локальными машинами мы могли бы просто переносить данные с помощью флешки, но на удаленный сервер нужно передавать данные только через сеть. Есть много способов реализации этой задачи.

В этой статье мы рассмотрим как выполняется копирование файлов с помощью утилиты 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 один из таких инструментов.

Pеклама
Посмотреть детали

Anubis – это максимально легкое open-source решение, созданное специально для защиты небольших веб-ресурсов от бесконечного потока запросов от ботов и AI парсеров. Этот инструмент можно считать "ядерным вариантом", потому что он заставляет ботов выполнять вычисления похожие на майнинг криптовалюты. Но это неплохая альтернатива для тех, кто не может или не хочет использовать Cloudflare. Посмотреть детали

29 комментариев к “Копирование файлов scp”

  1. а почему в описании команды описание опций два раза повторяются?
    -1 - использовать протокол SSH1;
    -2 - использовать протокол SSH2;
    -B - пакетный режим для передачи нескольких файлов;
    -C - включить сжатие;
    - l - установить ограничение скорости в кбит/сек;
    -o - задать нужную опцию SSH;
    -p - сохранять время модификации;
    -r - рекурсивное копирование директорий;
    -v - более подробный режим.

    И почему не указана опция -Р для порта, отличного от 22 ?

    Ответить
  2. Копирую с одного удаленного хоста на другой. На исходном 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
    Т.е. опция выбора порта не срабатывает... Как сделать, чтобы сработало?

    Ответить
  3. А можно ли не копировать а перемещаться(скопировать с сервера и на нём же удалить) ?
    А то не хочется сначала копировать, а потом удалять на сервере. Что то типа mv только для этой темы...

    Ответить
  4. "Обратите внимание, что папка, в которую вы собираетесь копировать должна завершаться косой чертой, иначе папка, которую вы копируете запишется вместо той, в которую нужно скопировать." - не увидел влияние слеша на процесс копирования (CentOS 8) - что с ним, что без него папка-источник целиком помещается в папку назначения без затирания папки назначения, либо каких бы то ни было файлов в ней. Это из-за различий в используемых дистрибутивах?

    Ответить
  5. Кто-то пробовал через 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 для того, чтобы положить файлы в системные каталоги?

    Ответить
  6. Наверное лучше всего смотреть на следующий вариант:
    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, но не стал пробовать.
    Хочется обойтись минимумом ПО.

    Ответить
  7. Доброго дня. Не подскажете, как быть с каталогом с пробелом? Копирую из home/pc/Рабочий стол/IN. Должно помочь экранирование, но выдает No such file or directory.

    Ответить
  8. Доброго дня. А не подскажите как скопировать файлы с локального компьютера (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
    Уже все варианты испробовал...(

    Ответить
  9. Нет. Получается, что я в терминале по ssh зашел на удаленный сервер и там пытаюсь выполнить команду. Естественно она не видит файлов на локальном компе. Наверное надо выполнять команду в терминале, не заходя на удаленный сервер.

    Ответить
  10. А как скопировать несколько файлов, указав путь к ним и так чтобы каждый файл в свое назначение, при этом только один раз авторизовавшись (одной командой)?

    Ответить
  11. Добрый день. Я наверное белая ворона: у меня никак файл с сервера 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:~$

    Скажите пожалуйста, что не так?

    Ответить
  12. При попытке скопировать файл командой:
    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

    Ответить

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