Перенос данных с сервера на сервер linux
Как организовать перенос файлов между серверами, когда объемы данных очень велики и нет возможности архивации и промежуточного сохранения?
На работе появилась такая задача: миграция на другой сервер. Мы меняли хостинг-провайдера, т.к. заканчивалось свободное дисковое пространство аккаутов, да и условия сотрудничества уже разонравились.
На момент миграции у нас было 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 (полевая мышка).
Что делать, если у вас есть большой "беспорядок" с файлами и каталогами для копирования? Вы можете использовать команду "tar" чтобы создать один файл, а затем скопировать этот файл, как указано выше, а затем использовать tar, чтобы распространить его на другом сервере . Но это похоже на то. не Unix-подобные. Там должен быть способ сделать это за один шаг, не так ли? Ну, конечно!
EВведите pipe вашей любимой оболочки. Мы все еще можем использовать tar, чтобы упаковать нужные нам файлы, а затем использовать SSH, чтобы получить их в другой системе (что и SCP использует под оболочками), и tar с другой стороны, чтобы распространить файлы обратно. Но зачем тратить время и пространство, создавая сам файл tar, когда мы могли бы просто создать pipe, которая охватывает две системы и передает данные tar через нее?
Используя тот же каталог, что и в предыдущем примере, попробуйте "tar -cf - mydir/* | ssh fieldmouse@madhat 'tar -xf -'"
Читайте также: