Перенос данных с сервера на сервер linux

Обновлено: 06.07.2024

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

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

На момент миграции у нас было 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 remote_user@remote_host:/path/to/remote/file /path/to/local/file . Если копируется не папка, можно удалить параметр -r из команды.

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

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

  • -p - параметр для передачи пароля
  • "password" - само значение пароля

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

  • -f - параметр для указания пути к файлу, который содержит в себе пароль. После выполнения команды файл необходимо удалить из соображений безопасности.

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

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

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

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

В качестве пользователя нужно использовать любого пользователя, который есть на сервере. Вместо IP вы можете также домен сервера. Только необходимо, чтобы у выбранного пользователя были права записи в указанную папку.

С помощью опции -r вы можете скопировать на удаленную машину целый каталог. Команда будет выглядеть вот так:

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

Если поменять местами локальный путь и сервер, то вы сможете копировать файлы scp c удаленного сервера на локальный компьютер:

Таким же самым образом вы можете копирование файлов scp или папок с сервера:

Обратите внимание, что папка, в которую вы собираетесь копировать должна завершаться косой чертой, иначе папка, которую вы копируете запишется вместо той, в которую нужно скопировать.

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

Скопируем папку с того же удаленного сервера:

Выводы

В этой статье мы рассмотрели как выполняется передача файлов scp, как это работает и что вы можете сделать с помощью этой утилиты. Как вы видите, перемещать файлы с одного сервера на другой очень просто. В Linux достаточно понять основы чтобы начать работать эффективнее! А команда scp один из таких инструментов.

Что такое FTP и зачем он нужен?


Ибо если же вам нужно перенести хотя бы гигабайты данных, то вы неминуемо столкнетесь с проблемами, что обрывается соединение, файлы передаются очень медленно и долго. Это объясняется простым фактом, что протокол FTP был создан аж в 1971 году. То есть ему уже 50 лет.

Это самый неудобный и медленный способ передачи данных, как при заливке с локальной машины на сервер, так и при передаче между серверами и хостингами. Более того, при необходимости передачи файлов с одного сервера на другой вебмастер обычно даже не знает как это осуществить с помощью FTP, ибо для этого нужно уметь обращаться с консольным FTP-клиентом, да и большинство людей даже не знают что так можно.

Как работать с файлами на сервере Linux не имея доступа по FTP?

Те, кто немного попродвинутей и опытней в вебмастерском деле, они уже могут знать, что существует возможность передачи файлов через более безопасный и быстрый протокол SSH. Да-да, тот самый, который используется для управления серверами и предоставляет возможность подключаться к серверу посредством консольного SSH-клиента такого как Putty.


Такие люди используют для работы с файлами утилиту WinSCP, являющуюся виндовым аналогом консольной утилиты scp.

А можно просто использовать любой FTP-клиент подключаясь SSH-пользователем на 22-порт. Можно даже рутом и тогда будете иметь доступ через Файлзиллу к любым файлам на сервере.


И такой вариант для работы с файлами всегда будет работать гораздо стабильнее, безопаснее и быстрее. А плюс к этому, не нужно даже настраивать FTP-службу на сервере.

Быстрый перенос и копирование файлов с сервера на сервер

Упаковка (архивация) файлов сайта на сервере и копирование с помощью SCP

Её, разумеется, часто можно выполнить и через панель управления. Затем копируем (отправляем) с исходного сервера на целевой:

Здесь после указания имени пользователя и IP через двоеточие указываем путь, куда мы хотим положить на целевом сервере этот файл.

Будет запрошен пароль от целевого сервера и файл улетит туда.

Затем его можно там распаковать:

и дальше уже положить файлы куда вам надо на новом сервере.

Копировать можно вводя команды и на новом сервере, следующим образом:

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

Результат будет точно таким же.

Однако, такой способ имеет некоторые недостатки. Во-первых, при таком копировании могут не сохраниться или сбиться права доступа к файлам и папкам. Вернее даже не права доступа, а владельцы. И их потом нужно будет выставлять, менять на нужные командой chown.

А еще даже при переносе с одного сервера на другой случается, что связь рвется, и нужно опять же процесс перезапускать.

Так вот, есть ещё более удобная штука, которая решает и эти заморочки. Это синхронизация.

Перенос файлов с одного сервера на другой синхронизацией утилитой rsync

Ну что-ж, теперь давайте посмотрим как это делается.

Для начала, её может понадобиться установить, хотя часто она и так уже есть на серверах. Если не окажется, то сделать так:

Но для начала, хочу сказать, что сам я этой утилитой пользуюсь не только для передачи файлов по сети между серверами. А пользуюсь для обычного копирования и внутри одного сервера. К примеру, надо мне на всякий случай сохранить текущие файлы и папки конфигурации сервера перед настройкой, я это в 2 секунды могу сделать с помощью rsync. Например так:

В этом случае будет создана папка /backup/etc и внутри будет все содержимое. Аналогично тому, как если бы вы воспользовались копированием

Однако есть нюансы, которые важно понимать, при работе с утилитой rsync. Обратите внимание, в первой команде в пути исходной папки нет закрывающего слеша. А во второй он есть, и наоборот его нету у второй папки.

Такой вариант отработает точно так же.

Однако если исполнить

Это будет работать совсем иначе. В этом случае, содержимое папки /etc нальется прямо в папку /backup. Что конечно совершенно не подходит. Ибо там может лежать что-нибудь ещё., потом разбираться что где лежит.

Без указания слеша папка будет скопирована полностью вместе с содержимым. Но ещё лучше сделать так:

Это значит, что будет создана папка /backup/etc_backup_131019/ и в нее синхронизируется содержимое папки /etc/

Если вдруг мне понадобится потом все вернуть, я исполню так:

Поэтому если вы переносите файлы, владельцы у которых на старом и новом серверах разные, то права вероятно придется сменить с помощью chown на пользователя, актуального на новом сервере.

Так нам нужно исполнить на старом сервере в качестве второго аргумента указан новый сервер и путь к папке сайта на нем, после двоеточия. Так же, как и в случае с scp. В этом случае, при существовании такой папки на целевом сервере ее содержимое будет синхронизировано с исходной. Если она не существует, то будет создана и затем синхронизирована. Но помните о слешах, тут надо внимательно.

Если вы сделаете например так:

В общем, вкусив rsync, вы больше не сможете жить без него, и будете вспоминать FTP как страшный сон. Я гарантирую это.

Запуск переноса файлов в фоновом режиме

А, еще кое что. За перенос огромного количества файлов, тех самых терабайт. Или даже десятков гигабайт. Такие процессы лучше запускать в фоновом режиме, а не прямо в той консоли, в которой вы подключились к серверу.

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

ставится точно так же, если отсутствует.

Затем её запускаем

И всё, у вас откроется как-бы терминал в терминале. Можете там делать всё, о чем мы говорили ранее, и вообще что угодно любое другое.

Теперь, если ваш терминал на локальной машине отвалится от сервера, вы всегда можете подключиться заново, набрать

И попадете туда, где вы запустили ваш процесс.

Можно и принудительно отключиться от screen, оставив процесс выполняться в фоне, а самому что-то продолжить дальше делать в основном терминале. Для этого надо нажать комбинацию клавиш ctrl+a, и затем D. А вернуться потом обратно screen -r.

Еще есть куча вариантов и способов для этой тривиальной задачи, но в 95% случаев этого достаточно.

Как переносить сайты между серверами по FTP, если нету SSH?

А ещё, вот это вот всё очень помогает понимать как можно удобнее и быстрее бэкапить свои данные. Ибо утилита rsync позволяет не перегонять весь объем данных по сети, а экономно и быстро слить только новые и изменившиеся данные. Вообще, rsync имеет кучу всевозможных опций. Умеет копировать и так и сяк. Может попутно удалять файлы как с исходного места, так и чистить лишние на целевом и ещё много всякого. Это же может делать и lftp. Но с этим стоит быть очень аккуратным, во избежание потери данных.

Надеюсь, это чуточку облегчит кому-то жизнь и поможет стать существенно профессиональнее 🙂

wikiHow работает по принципу вики, а это значит, что многие наши статьи написаны несколькими авторами. При создании этой статьи над ее редактированием и улучшением работали авторы-волонтеры.

В Linux среде с несколькими серверами многие задачи предполагают перемещение одного или нескольких файлов с одного сервера на другой. В зависимости от количества файлов, которые вы должны переместить, есть несколько команд, которые могут вам помочь. . Предположим для этих обсуждений, что наши серверы - alice и madhat, и что наш пользователь на alice – это rabbit (кролик), и наш пользователь на madhat - fieldmouse (полевая мышка).

Изображение с названием Transfer Files from One Linux Server to Another Step 1

Изображение с названием Transfer Files from One Linux Server to Another Step 2

Чтобы скопировать весь каталог, мы можем снова обратиться к команде "scp". TНа этот раз мы добавим ключ -r, чтобы заставить копию действовать "рекурсивно". "scp -r mydir fieldmouse@madhat:." - скопирует весь каталог"mydir" на другую систему, включая все его содержание и дополнительные каталоги. Каталог на madhat все равно будет называться mydir.

Что делать, если у вас есть большой "беспорядок" с файлами и каталогами для копирования? Вы можете использовать команду "tar" чтобы создать один файл, а затем скопировать этот файл, как указано выше, а затем использовать tar, чтобы распространить его на другом сервере . Но это похоже на то. не Unix-подобные. Там должен быть способ сделать это за один шаг, не так ли? Ну, конечно!

EВведите pipe вашей любимой оболочки. Мы все еще можем использовать tar, чтобы упаковать нужные нам файлы, а затем использовать SSH, чтобы получить их в другой системе (что и SCP использует под оболочками), и tar с другой стороны, чтобы распространить файлы обратно. Но зачем тратить время и пространство, создавая сам файл tar, когда мы могли бы просто создать pipe, которая охватывает две системы и передает данные tar через нее?

Используя тот же каталог, что и в предыдущем примере, попробуйте "tar -cf - mydir/* | ssh fieldmouse@madhat 'tar -xf -'"

Читайте также: