Скрипт резервного копирования файлов
Ценность резервного копирования ощущает каждый, кто сталкивался с потерей файлов.
Для резервного копирования можно использовать профессиональные платные продукты, например, Symantec Backup Exec Desktop and Laptop Option, а можно и самому бесплатно создать эффективный механизм резервного копирования файлов, как документов пользователя, так и служебных файлов на серверах, с помощью доступных подручных средств: командный файл и пара бесплатных программ.
Резервное копирование будет иметь следующие функции:
- копирование всех файлов некоторого каталога и его подкаталогов (полное копирование, full backup), выполняется довольно долго при большом количестве файлов
- копирование файлов, измененных после последнего резервного копирования (добавочное копирование, incremental backup) – определяется по архивному атрибуту, этот режим выполняется довольно быстро за счёт небольшого числа файлов
Реализация основана на следующих идеях:
- файлы резервных копий сохраняются в в виде ZIP файлов, это удобно для просмотра пользователями, так как на любом компьютере есть программа ZIP Folder или архиватор, поддерживающий формат ZIP
- каждая резервная копия сохраняется в отдельном файле, в названии файла указывается дата снятия копии, это облегчает поиск нужной редакции восстанавливаемого файла
Для создания ZIP файлов потребуется программа-архиватор с интерфейсом командной строки, например, 7-ZIP.
Предположим, что нам потребуется создавать резервные копии документов пользователя (%USERPROFILE%\Documents) и сохранять их на файловом сервере, где выделены папки для резервных копий каждого пользователя \\FILESERVER\Backup\%USERNAME%
Командный файл полного резервного копирования определяет имя файла по текущей дате, например, fullbackup_20130222.zip для 22 февраля 2013 года и вызывает архиватор:
Предполагается, что программа 7-ZIP уже установлена на компьютере, и путь к её файлам прописан в переменной PATH. Если нет, необходимо добавить в последнюю строку путь к файлу.
В результате, на файловом сервере будет создан файл fullbackup_20130222.zip с файлами пользователя. Пользователь может в любой момент открыть файл резервной копии на сервере и извлечь интересующий файл.
Отличие добавочного копирования состоит в том, что необходимо добавлять в ZIP не все файлы, а только те, которые имеют установленный архивный аттрибут («файл готов для архивирования»). Для этого используем программу DIR с необходимыми параметрами, сохраняя вывод в файл:
Необходимо запускать команду из Unicode среды ( команда cmd /u incbackup.cmd ), чтобы корректно обработать файлы, в названии которых есть символы из расширенного набора.
Следующим шагом необходимо подготовить сформированный список файлов для 7-ZIP:
- преобразовать кодировку из UTF-16 в UTF-8 (требуется для 7-ZIP),
- убрать из путей файлов начальную часть пути к каталогу
Это можно сделать одним запуском программы nhreplace:
Остаётся добавить назначение переменных и удаление файла списка после записи файла резервной копии, итоговый командный файл для добавочного копирования будет выглядеть так:
Также в файле присутствуют команды pushd-popd для перехода в каталог копируемых файлов и обратно. Перемещение в этот каталог необходимо для нормальной работы 7-ZIP со списком. В зависимости от того, как запускается командный файл и нужно ли возвращаться в исходный каталог, можно оставить пару pushd-popd , или ограничиться командой cd "%files_folder%"
Поскольку 7-ZIP не имеет функции сброса атрибута файла, для этого можно использовать команду attrib.
Созданные командные файлы fullbackup.cmd и incbackup.cmd можно запускать как вручную, так и по расписанию.
Например, файл incbackup.cmd можно запускать и несколько раз в день, хоть каждый час, и он будет обновлять файл резервной копии текущего дня по мере того, как пользователь вносит изменения в свои документы, при этом время резервного копирования будет небольшим.
При этом пользователю будут доступны сделанные копии по дням, и он сможет сам, без участия администратора, восстанавливать не только определённый файл, но и различные его редакции (по датам).
Этот скрипт подходит для конфигурации, когда компьютер имеет высокоскоростное подключение к серверу , так как скрипт обрабатывает ZIP файл резервной копии, находящийся на файловом сервере.
В моей предыдущей статье я описал пример скрипта, который может заархивировать и закинуть в облако определенный объем файлов пользователя без его участия, тем самым обеспечив простейшее резервное копирование файлов пользователя. Скрипт обеспечивает закрытие следующих вопросов:
- быстрое (идеально в фоне);
- сохраняло бы как актуальную версию файлов, так и предыдущие;
- хранилище файлов было бы недоступно вирусам или стихийным бедствиям типа уничтожения носителя или его воровства;
- содержимое резевной копии было бы доступно только пользователю, т.е. паролировалось.
- Хранение паролей в теле скрипта. Да, многие программы хранят пароли незашифрованными в текстовых файлах, и защита этих данных происходит через контроль доступа к файлам, но все таки вынести пароль из кода — это признак хорошего тона и минимальной защиты на случай, если каким то образом рабочий скрипт попадет в чужие руки.
- Отсутствие проверки успешного завершения операции, и откат к предыдущему состоянию в случае если операция не была успешно завершена.
- Отсутствие логирования и оповещения пользователя об успешности операции, если скрипт запускается через планировщик заданий.
Послесловие
Как я уже сказал и Вы сами наверное осознали - использование подобного bat файл 'а зачастую экономит кучу времени, т.е. один раз написал и периодически запускаешь одним кликом и вместо многоминутных тычков мышкой и ползания по всем папкам получаешь автоматизированный процесс копирования.
При желании можно поставить запуск этого bat -ника в определенные дни через планировщик Windows (или другие программы позволяющие это делать) и вообще забыть о проблеме долгих ручных backup 'ов.
Если есть какие-то вопросы или проблемы - спрашивайте. Как всегда помогу чем смогу ;)
PS: Если мне не изменяет память, то это кусочек темы из умных админских книжек, а именно из раздела " Автоматизация администрирования ".. так что можете собой гордится :)
Белов Андрей (Sonikelf) Заметки Сис.Админа [Sonikelf's Project's] Космодамианская наб., 32-34 Россия, Москва (916) 174-8226
Примеры инструментов для работы с Объектным хранилищем:
В инструкции приведен пример создания скрипта, который будет регулярно запускать консольный клиент, архивировать и переносить важные данные в Объектное хранилище.
Меняем формат файла и пробуем его запустить
Жмем " Применить " и " Ок ". Теперь мы можем менять расширение известных системе файлов, а посему направляемся к нашему файлику, жмем правой кнопкой мышки, выбираем " Переименовать " и методом печатания на клавиатуре меняем расширение с txt на bat (на вопрос системы стоит ли это делать отвечаем утвердительно).
В результате мы имеем следующую картину (в вашем случае файлик называется иначе, но имеет тот же формат):
Собственно, все, что нам остается - это запустить этот файл простым кликом по нему мышки.
Если Вы все сделали правильно, то перед Вами промелькнет консоль и по известному пути появится новая папочка с заданным заранее названием и файлами внутри скопированными из известной Вам папки, т.е картина получится примерно следующая:
Ну или несколько другая, в зависимости от того какие пути и названия папок Вы прописывали в команде.
Отредактировать файлик можно сменив ему расширение обратно на .txt и открыв любым текстовым редактором.
Настроить управление потоком
Предполагая, что скрипт настроен правильно, он при запуске должен прочитать команду ввода, присвоить значения из нее каждой переменной, выполнить функцию tarandzip, а затем выполнить функцию movetoSpace.
Если сценарий завершится неудачно между любой из этих точек, он должен напечатать вывод нашей функции showhelp, чтобы помочь пользователям в устранении неполадок.
Мы можем упорядочить отлов ошибки, добавив в конец файла условную инструкцию if / then / else:
Первый оператор if в приведенном выше разделе проверяет, что третья переданная переменная не пуста. Это происходит следующим образом:
- [] — квадратные скобки означают, что то, что находится между ними, является тестом. В этом случае проверка заключается в том, чтобы конкретная переменная не была пустой;
- ! — в данном случае этот символ означает «нет»;
- -z — эта опция указывает на пустую строку и в сочетании с ! мы запрашиваем не пустую строку;
- $ GIVENNAME указывает, что строка, которая не должна быть пустой, является значением, присвоенным переменной $GIVENNAME. Этой переменной присваивается значение, переданное третьим параметром, при вызове скрипта из командной строки. Если мы передадим сценарию менее 3 параметров, в коде не будет третьего параметра для присвоения значения $GIVENNAME, он назначит пустую строку и этот запуск завершится ошибкой.
Перенести файлы в Объектное хранилище
Добавим в скрипт резервного копирования функцию передачи файла movetoSpace в выбранное пространство с помощью команды s3cmd. Используем s3cmd и переменные, которые мы объявили ранее, для создания команды, которая будет помещать файлы резервных копий в выбранное пространство:
- /bin/s3cmd вызывает s3cmd — инструмент командной строки, используемый для управления сегментами хранилища объектов;
- put используется s3cmd для загрузки данных в бакет;
- $ GIVENNAME- $ DATETIME.tar.gz — это имя резервной копии, которая будет загружена в пространство. Он состоит из четвертой и первой объявленных нами переменных, за которыми следует .tar.gz, и создается функцией tarandzip;
- s3: // $ DST ; — место, куда мы загружаем файл;
- s3: // — это схема типа URI, используемая для описания мест хранения объектов в сети, а $DST; — это третья переменная, которую мы объявили ранее.
Добавьте уведомления о том, что процесс переноса файлов начался:
Поскольку команда будет либо успешной, либо неудачной (это означает, что она либо загрузит файлы в выбранное пространство, либо нет), можно сообщить пользователям, сработала ли она, повторив одну из двух строк, содержащихся в if/then/else, например:
В целом функция movetoSpace должна выглядеть так:
Собрать файлы
Прежде чем скрипт сможет передавать что-либо в выбранное пространство, ему сначала необходимо собрать нужные файлы и объединить их в единый пакет, который мы можем загрузить. Это выполняется с помощью утилиты tar, условных операторов и функции tarandzip:
Когда вызывается инструкция if, скрипт выполняет команду tar и ожидает результата. Если команда выполнена успешно, будут выполнены строки после оператора then:
Часть else этого скрипта будет выполняться только в том случае, если команда tar обнаружит ошибку при выполнении:
Заканчивайте скрипт if/then/else фразой fi , что на языке bash означает, что предложение if закончилось.
Завершенная функция tarandzip будет выглядеть так:
Создать скрипт для резервного копирования
Скрипт создаст резервную копию файла или каталога с помощью tar и загрузит резервную копию в Объектное хранилище с помощью s3cmd.
Откройте на своем сервере домашнюю директорию:
С помощью редактора nano создайте пустой файл, например, с именем bkupscript:
Начните писать скрипт резервного копирования в текстовом редакторе с шебанга. Шебанг — это директива интерпретатора, которая позволяет запускать скрипты или файлы данных как команды и выглядит как последовательность из двух символов: решетки и восклицательного знака. Включая шебанг в начало скрипта, мы говорим оболочке запускать команды файла в bash.
Bat файл - что к чему, вводная
Для начала немного о том, что такое bat файл , зачем он нужен и с чем его (или их) едят. Дабы не изобретать велосипед воспользуюсь выдержкой из Википедии:
Пакетный файл (т.е bat файл, от англ. batch file ) — текстовый файл в MS-DOS, OS/2 или Windows , содержащий последовательность команд, предназначенных для исполнения командным интерпретатором.
Пакетный файл — аналог shell script в Unix -подобных операционных системах.
Пакетные файлы полезны для автоматического запуска приложений. Основная область применения — автоматизация наиболее рутинных операций, что регулярно приходится совершать пользователю компьютера.
Примерами таких операций могут служить — обработка текстовых файлов; копирование, перемещение, переименование, удаление файлов; работа с папками; архивация; создание резервных копий баз данных и т. п.
Пакетные файлы поддерживают операторы if и goto (а в системах семейства Windows NT и расширенный оператор for ), что позволяет обрабатывать результаты выполнения предыдущих команд или приложений и в зависимости от этого выполнять дальше тот или иной блок команд (как правило, в случае удачного завершения приложение возвращает 0 в переменной errorlevel; в случае неудачного — 1 или большее значение).
Пакетные файлы в DOS имеют расширение . bat ; для других операционных систем они могут иметь другие расширения — например, . CMD в Windows NT и OS/2 , или .BTM в 4DOS или подобных оболочках.
С теорией разобрались, приступим к, собственно, практике, а именно созданию bat-ника.
Скрипт создания полного архива
Автоматизировать резервное копирование с помощью Crontab
Настройте задание cron, которое будет использовать скрипт для регулярного резервного копирования в выбранное пространство. В рамках этого примера резервное копирование будет выполняться каждую минуту.
Сделайте скрипт исполняемым:
Отредактируйте файл crontab, чтобы скрипт запускался каждую минуту:
При первом запуске команды crontab -e будет предложено выбрать редактор из списка:
Можно выбрать nano по умолчанию или любой другой текстовый редактор.
Перейдя в crontab, добавьте следующую строку внизу скрипта:
Закройте файл сочетанием клавиш CTRL+Х и сохраните внесенные изменения клавишей Y+ENTER.
Если оставить задание cron запущенным без каких-либо изменений, новый файл будет копироваться в выбранное пространство каждую минуту. Убедившись, что cron работает успешно, перенастройте crontab для резервного копирования файлов с нужным интервалом.
Скрипт создания полного архива
Пример скрипта
Завершенный скрипт выглядит следующим образом:
После проверки скрипта закройте файл сочетанием клавиш CTRL+Х и сохраните внесенные изменения клавишей Y+ENTER перед выходом из nano.
Автоматизировать резервное копирование с помощью Cyberduck
На локальной машине имеется директория, содержимое которой нужно периодически копировать в Объектное хранилище. Для этого написан специальный скрипт и добавлено задание Cron, которое отправляет резервную копию в хранилище каждый день в указанное время.
Обратите внимание на синтаксис команды duck . В приведенном примере используются ключ --existing , который указывает, что делать с уже имеющимися в хранилище файлами.
Опция rename переименовывает уже имеющуюся резервную копию, добавляя к её имени время и дату.
При выполнении приведенной команды программа сравнит загружаемую резервную копию с уже имеющейся по размеру, дате изменения и контрольной сумме. Если параметры отличаются, то старая версия будет удалена, а новая — загружена в хранилище.
При использовании опции skip в хранилище будут загружены только новые файлы (те, которые появились в папке на локальной машине после предыдущей загрузки). Уже имеющиеся файлы не будут загружены, даже если на локальной машине они были изменены.
Опция overwrite удаляет из хранилища имеющуюся резервную копию и загружает новую.
Набросал ещё один маленький BAT скрипт для резервного копирование папки. Внесите свои данные и через scheduler настройте расписание резервного копирования.
Новые команды:
call pass.bat xx x — вызов внешней программы, возвращающей обратно переменную xx со значением, указанным для идентификатора x.
Скрипт pass.bat приведен условно, метод защиты паролей может быть выбран другой, но для тех и этот вариант подходит, привожу самый простой код этого скрипта:
Данный код при его вызове находит рядом с собой файл pass.txt, и присваивает переменной, имя которой указано в первом аргументе вызова скрипта, значение той строки файла pass.txt, номер которой указан во втором аргументе вызова скрипта. Расположение файлов pass.bat и pass.txt не принципиально, лишь бы они лежали в одном каталоге, который указан в переменной path системы.
set i=1 — установка счетчика попыток на 1
call :loging "-----------------------------------" — вызов процедуры логирования. Процедуре передается строка, которая далее записывается в 2 файла — файл лога %filebkp%-log.txt и отдельный файл текущих операций %filebkp%-log.tmp, который затем отправляется пользователю как отчет об результате архивирования.
Соответственно строки логирования в теле скриптов одновременно показывают пользователю совершаемые операции во время работы, записывают их в логи и для меня являются комментариями в теле скрипта, поясняющими что выполняется на последующих строках.
Соотвественно скрипт полного копирования и скрипт инкрементного копирования выполняют следующие операции:
Данные скрипты приведены лишь как примеры, переписывать под PowerShell пока нет желания, т.к. мне важно чтобы он работал на любой системе, включая Windows XP. Защиты от кражи паролей здесь нет, самому было бы интересно что предложили бы специалисты по безопасности, но разделение кода и паролей с возможностью размещения паролей в другом каталоге хотя бы снимает вероятность глупой ошибки, что при отправке скрипта другу ему же достанутся и пароли.
Сегодня мы узнаем про то, что такое bat файл и заодно создадим один из них.
Думаю, что многие, так или иначе, периодически создают резервные копии (так называемые backup -ы) тех или иных файлов и папок.
Вроде все привычно и делать ничего особо сложного не надо: вставить флешку, открыть " Мой компьютер ", найти что надо скопировать, выделить, тыкнуть мышкой, выбрать "скопировать", перебраться в нужный каталог, тыкнуть "вставить" и тд.
Но зачастую все эти клики и лишние телодвижения несколько утомляют и отнимают ценное время, особенно при частых копированиях одних и тех же данных. В этой статье я расскажу как автоматизировать этот процесс посредством консоли, а точнее написания такой штуки как bat файл .
Скрипт создания инкрементного архива
Требования для выполнения примера
В качестве консольного клиента используем S3cmd с инструментом для автоматизации crontab.
Для начала работы потребуется:
- Облачный или выделенный сервер с установленной Ubuntu версии не ниже 18.04. Объектного хранилища.
- Настроенный S3cmd.
Пример настройки расписания
В Task Scheduler настраиваем новое задание.
Выбираем пользователя, от имени которого будет выполняться резервное копирование. После сохранения задания нас спросят пароль от него. Ставим галку Run whether user is logged or not - запускать даже если юзер не залогинен.
В триггерах настраиваем расписание. У меня резервное копирование происходит раз в сутки.
Указываем ссылку на наш BAT файл.
Проверяем настройки. OK.
Теперь папка будет резервироваться раз в день. С настройкой NumFolders=10 в BAT файле мы будем хранить данные за последние 10 дней.
Если хотите хранить ежедневные и ежемесячные резервные копии - сделайте два BAT файла и два расписания резервного копирования в разные папки.
Добавляем в файл команду, например, для копирования
Далее, собственно, нам в этот файлик нужно ввести команду, которая будет воспроизводиться по средством консоли ( cmd ) при запуске этого файла. В данном случае мы воспользуемся командой xcopy ибо именно она позволяет копировать файлы, каталоги и подкаталоги. Учитывая все пути у нас получится следующая команда:
xcopy C:\test\testcopy C:\test\backup /f /i /y /s
Разъясняю что тут к чему:
- xcopy - это сама команда;
- C:\test\testcopy - это источник, т.е. папка откуда копируются файлы и каталоги;
- C:\test\backup - это результат, т.е. место, куда будут скопированы файлы и каталоги;
- /f /i /y /s - дополнительные параметры синтаксиса для команды xcopy (см.синтаксис ниже по тексту).
Количество строчек может быть любым, т.е. если Вам надо скопировать 100 папок, Вы пишете 100 строчек в одном файле и меняете в них только пути.
Далее, касательно синтаксиса (какие дополнительные параметры есть, какие можно дописать и зачем они нужны).
Какие есть (т.е. те, что я указал в данном примере):
- /f - выводит имена исходных файлов и файлов-результатов в процессе копирования
- /i - создает новый каталог в случае, если тот отсутствует в конечном пути
- /y - перезаписывает файл в случае, если он уже есть
- /s - копирует каталоги и подкаталоги, если они не пусты. Если параметр /s не задан, команда xcopy будет работать только с одним каталогом.
Как по мне - это основной список параметров необходимых для "тихого" копирования, т.е. без лишних вопросов о перезаписи, создания каталогов и прочей шушеры. Касательно остального синтаксиса можно почитать, например, тут.
Далее нам надо сменить формат файла с txt на bat . Делается это следующим образом.
Ссылки
Назначить переменные
Добавьте в скрипт переменные прямо под шебангом в верхней части текстового файла:
- DATETIME содержит метку времени, которую нужно прикрепить к имени полученного файла, чтобы каждый файл, резервная копия которого хранится в пространстве, имел уникальное имя. Эта временная метка создается путем вызова команды date и форматирования вывода для отображения двух последних цифр года (% y), двух цифр месяца (% m), двух цифр дня (% d), час (% H), минуты (% M) и секунды (% S);
- SRC — это исходный путь для файла или папки, в которую мы делаем резервную копию. $1 указывает, что мы берем это значение из первого параметра, переданного скрипту;
- DST — место назначения файла. В нашем случае это имя пространства, в которое мы загружаем резервную копию. Это имя будет получено из второго параметра, переданного в скрипт, как указано в $2;
- GIVENNAME — выбранное пользователем имя для файла назначения. Результирующее имя файла будет начинаться с GIVENNAME, и к нему будет добавлено DATETIME. Это имя происходит от третьего параметра, переданного скрипту $3.
Как создать bat файл и использовать его
Давайте подготовим небольшое тестовое поле, чтобы было на базе чего экспериментировать. Откройте мой компьютер и создайте на диске C:\ папочку test . Зайдите в неё и создайте в ней папку testcopy .
Накидайте туда файлов (штук 5-10 ) - фотки, документы и тд и тп (любых короче). Поле для экспериментов готово. Далее нам надо создать, собственно, сам bat файл по нажатию на который у нас будет происходить копирование папки C:\test\testcopy в, скажем, папку C:\test\backup . Создавать вторую папку (которая backup ) не надо - она будет появляться автоматически.
Создать bat очень просто. Жмем правой кнопкой мышки там где хотим его создать (расположение не важно - можно прямо на рабочем столе) и выбираем " Создать " - " Текстовый документ ".
Задаем созданному файлу название и открываем его блокнотом или любым другим текстовым редактором. Т.е. на данный момент мы имеем открытый текстовый файлик, который называется, допустим, копирование.txt .
Функции
- С помощью xcopy делает резервные копии папки.
- Каждый бэкап сохраняется в отдельную подпапку вида DD.MM.YYYY_hhmmmss.
- С помощью 7-Zip архивирует резервные копии.
- Удаляет старые резервные копии.
- DirName - название папки
- SourceDir - что бэкапим
- BackupDir - куда бэкапим
- NumFolders - сколько подпапок с бэкапами хранить
- a7z - путь к 7z.exe
Читайте также: