Как перенести файлы с одного сервера на другой
Перейти к содержимому

Как перенести файлы с одного сервера на другой

  • автор:

Как перенести файлы с одного сервера на другой?

Нужно перенести файлы с одного сервера на другой по ftp/ssh напрямик. Не через меня.
Как это реализовать?

  • Вопрос задан более трёх лет назад
  • 6795 просмотров

Комментировать

Решения вопроса 1

Scarfase1989

Дмитрий Айткулов @Scarfase1989

архивируешь проект на одном сервере, на втором логинишься по ssh, дальше scp в помощь

Ответ написан более трёх лет назад

Комментировать

Нравится 2 Комментировать

Ответы на вопрос 4

Способы переноса файлов между серверами

На сервере А есть архив mysite.tar.gz с файлами сайта, который нужно перенести на сервер Б.

Используя хостинг виртуальных серверов, у вас есть два варианта подобного переноса:

При помощи FTP или SFTP протоколов.

В случае выбора этого способа действия будут следующими:

  • Подключаемся по FTP/SFTP к серверу А.
  • Скачиваем архив c сервера А на ПК.
  • Подключаемся по FTP/SFTP к серверу Б.
  • Загружаем архив с ПК на сервер Б в необходимую директорию.

При помощи утилиты SCP

Этот способ достаточно удобен по причине того, что отпадает необходимость копирования данных на промежуточное хранилище (в данном случае – ПК). Копирование файла происходит напрямую с одного сервера на другой и для выполнения этого действия используется абсолютно не сложная команда:

scp -P 22 mysite.tar.gz root@11.11.11.11:/var/www/html/

Пример этой команды реализует копирование архива mysite.tar.gz в директорию /var/www/html/, которая расположена на сервере с IP: 11.11.11.11. Порт подключения используется 22.

Стоит отметить, что эта утилита позволяет копировать сразу несколько файлов. В этом случае файлы указываются следующим образом:

scp -P 22 filename1 filename2 filenameN root@11.11.11.11:/directoryName/

Также, эта утилита может копировать и папку, но в этом случае необходимо использовать параметр –r, который включает рекурсивное копирование всех файлов и папок в указанной директории. Попытка скопировать папку без указания этого параметра завершится ошибкой «Not a regular file». Пример корректной команды копирования папки приведен ниже:

scp -P 22 -r directory root@11.11.11.11:/var/www/html/

В результате папка с именем directory вместе с её содержимым будет скопирована в директорию /var/www/html/, расположенную на сервере 11.11.11.11.

Теперь вы знаете 2 новых способа переноса данных между серверами. Если есть вопросы по работе с архивами, то рекомендуем ознакомиться с нашей статьей Создание и распаковка архивов в Linux.

Как скопировать файлы с одного сервера на другой без посредников

Типовая ситуация: надо с одного сервера перекинуть какие-то файлы на другой сервер (например, файлы сайта), но при этом не хочется их скачивать к себе локально, а желательно передать сразу напрямую между серверами.

Для начала предоставим принимающему серверу доступ на отправляющий. На принимающем сервере из под рута делаем так:

cat /root/.ssh/id_rsa.pub

Если такого файла нет, значит на принимающем сервере не создана пара ключей. Можно создать одной командой, отвечая на все её вопросы вариантами по умолчанию (т.е. просто жмёте Enter многократно):

ssh-keygen -r rsa

Если файл есть (был ранее ли создан вами только что), то при просмотре файла командой cat видим в нём ключ — копируем его целиком.

Затем идём на отправляющий сервер и открываем там на редактирование файл (если файла нет, то и на отправляющем сервере делаем ssh-keygen ):

nano /root/.ssh/authorized_keys

Вставляем туда отдельной строкой скопированный ключ, сохраняем (в nano это можно сделать кнопкой F2 ). Теперь у нас открытый ключ принимающего сервера добавлен на отправляющий сервер в файл с разрешенными для входа ключами. Это значит, что мы можем зайти по ssh с принимающего сервера на отправляющий. Но нам не очень-то нужен ssh с консолью (мы не собираемся выполнять команды), а хватит scp — это программа для копирования файлов через ssh-протокол.

Поэтому на принимающем сервере делаем:

scp -rpC root@domain.tld:/var/www/site/ /root/

Где domain.tld — это отправляющий сервер, а /var/www/site/ — это тот каталог, который вы хотите оттуда скопировать. А скопируется он, соответственно, внутрь каталога /root/ на принимающем сервере.

У scp мы использовали следующие параметры:

  • -r — рекурсивное копирование, т.е. со всеми вложенными каталогами и файлами, что нам собственно и надо при копировании целой директории
  • -p — сохранять права и дату/время создания и модификации файлов
  • -C — сжимать данные при передаче (нет смысла добавлять этот параметр, если вы копируете архив)

Данный метод должен работать на большинстве дистрибутивов «из коробки». Проблемы могут быть только если пользователю root запрещен логин на отправляющем сервере. Но это уже отдельная история. Если что — спрашивайте в комментах.

Если вам не надо, чтобы сохранялся в будущем доступ с принимающего сервера на отправляющий, то надо, соответственно, убрать добавленный ключ из файла /root/.ssh/authorized_keys

Перенос файлов между серверами напрямую по SSH через SCP

Как организовать перенос файлов между серверами, когда объемы данных очень велики и нет возможности архивации и промежуточного сохранения?

На работе появилась такая задача: миграция на другой сервер. Мы меняли хостинг-провайдера, т.к. заканчивалось свободное дисковое пространство аккаутов, да и условия сотрудничества уже разонравились.

На момент миграции у нас было 2 аккаунта, каждый по 20Гб дискового пространства, в итоге мы должны были все перенести на 1 аккаунт с объемом дискового пространства равным 60Гб.

По-старинке это выглядело бы примитивно и примерно так: заархивировать небольшой объем информации в ZIP-архив, сохранить с сервера на локальный компьютер, затем с локального компьютера перенести на удаленный сервер по FTP или SFTP. Но не в этот раз. Ведь у нас было достаточно большое количество интернет-проектов, перенос которых изначально становился кропотливым делом, а беря в расчет, что свободного места на каждом из аккаунтов оставалось чуть менее 2Гб, вариант архивации на сервере был невозможен.

Поэтому, недолго думая, я полез в гугл с запросом «ssh copy files from one server to another directly». В итоге решение оказалось довольно простым, единственное условие — наличие SHH на серверах, между которыми будет осуществляться обмен данными.

Итак, для этого понадобится команда

scp -r /path/to/local/file remote_user@remote_host:/path/to/remote/file

Что она означает:

  • scp — мы сообщаем серверу название утилиты, через которую будут обрабатываться эти команды;
  • -r — параметр, говорящий о том, что копируемая папка (если это папка) должна копироваться рекурсивно, т.е. со всеми вложенными подпапками. Если копируется не папка, можно удалить этот параметр из команды;
  • /path/to/local/file — путь к локальному файлу, в мое случае к файлу сервера, с которого будет осуществлен перенос данных;
  • remote_user@remote_host — данные для подключения к удаленному серверу, которые имеют вид [имя_пользователя]@[адрес_сервера];
  • /path/to/remote/file — путь к конечной папке сервера, куда будут загружены файлы.

Предостерегая вас от двойной работы и вопросов:

  1. пути к копируемым папкам/файлам нужно вводить абсолютные. Это значит, если, допустим, у вас есть аккаунт у хостинг-провайдера и называется он vaspupkin1, вероятней всего, что он находится в папке наряду с остальными аккаунтами пользователей и может иметь полный путь от корня сервера такой: /home/w/vaspupkin1 , в то время как файлы сайта могут лежать в папке /home/w/vaspupkin1/public_html . Поэтому, чтобы скопировать папку с сайтом на другой сервер, мы должны в первой части команды scp после параметра -r ввести следующее: /home/w/vaspupkin1/public_html , в то время, когда вы, подключаясь к своему аккаунту по FTP, сразу попадаете в папку /vaspupkin1, что является относительным, а не абсолютным путем.
  2. при копировании папки описанным выше образом на удаленном сервере создается эта же папка. Т.е. когда вы, копируя папку /home/w/vaspupkin1/public_html , вводите конечный адрес типа /var/i/vaspupkin1/http_docs , подразумевая, что структура папки public_html будет скопирована в папку http_docs, то ничего подобного не произойдет, в итоге у вас получится это — /var/i/vaspupkin1/http_docs/public_html , имейте это ввиду.

Если файлы нужно скопировать с удаленного сервера на локальный, тогда исползуем эту же команду, поменяв местами конечный и начальны пути копирования: scp -r remote_user@remote_host:/path/to/remote/file /path/to/local/file . Если копируется не папка, можно удалить параметр -r из команды.

Обновление от 26.06.2019

Одним из способов передать в SCP пароль является использование утилиты sshpass. В зависимости от направления копирования используйте команды, описанные в этой статье ранее. Ниже, в качестве примера, приведена команда для копирования информации с локального сервера (к которому сейчас подключен пользователь) на удаленный сервер, где для удаленного сервера необходимо ввести регистрационные данные.

sshpass -p "password" scp -r /path/to/local/file remote_user@remote_host:/path/to/remote/file
  • -p — параметр для передачи пароля
  • «password» — само значение пароля

Если не хотите «светить» пароль в истории bash-запросов, тогда используйте код ниже.

sshpass -f "/путь/к/файлу-с-паролем" scp -r /path/to/local/file remote_user@remote_host:/path/to/remote/file
  • -f — параметр для указания пути к файлу, который содержит в себе пароль. После выполнения команды файл необходимо удалить из соображений безопасности.

Как установить SSHPASS

Ниже перечислены способы установки SSHPASS для различных ОС:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *