Выбрать главу

Код

Листинг 10.7. Сценарий remotebackup

··#!/bin/bash

··# remotebackup — принимает список файлов и каталогов, создает единый

··#·· сжатый архив и отправляет его по электронной почте на удаленный сайт

··#·· для сохранения. Может запускаться по ночам для сохранения важных

··#·· пользовательских файлов, но не может служить заменой более строгой

··#·· системы резервного копирования.

··outfile="/tmp/rb.$$.tgz"

··outfname="backup.$(date +%y%m%d). tgz"

··infile="/tmp/rb.$$.in"

··trap "$(which rm) −f $outfile $infile" 0

··if [$# −ne 2 −a $# −ne 3]; then

····echo "Usage: $(basename $0) backup-file-list remoteaddr {targetdir}" >&2

····exit 1

··fi

··if [! -s "$1"]; then

····echo "Error: backup list $1 is empty or missing" >&2

····exit 1

··fi

··# Сканировать записи и создать фиксированный список в файле infile.

··#·· В ходе этой операции выполняются экранирование пробелов и подстановка

··#·· шаблонных символов в именах файлов, то есть имя файла "this file"

··#·· превращается в this\ file, что избавляет от необходимости использовать

··#·· кавычки.

··while read entry; do

····echo "$entry" | sed −e 's/ /\\ /g' >> $infile

··done < "$1"

··# Фактическое создание архива, его кодирование и отправка.

··tar czf −$(cat $infile) | \

····uuencode $outfname | \

····mail −s "${3:-Backup archive for $(date)}" "$2"

··echo "Done. $(basename $0) backed up the following files: "

··sed 's/^/ /' $infile

··/bin/echo −n "and mailed them to $2 "

··if [! -z "$3"]; then

····echo "with requested target directory $3"

··else

····echo ""

··fi

··exit 0

Как это работает

Убедившись с помощью простых проверок в том, что продолжение работы возможно, сценарий обрабатывает список важных файлов, передаваемый в первом аргументе командной строки, в цикле while , экранируя пробелы в именах файлов. Экранирование заключается в добавлении символа обратного слеша перед каждым пробелом. Затем командой tar создается архив. Она не может читать список файлов со стандартного ввода, поэтому список передается в виде аргументов, с помощью команды cat.

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

ПРИМЕЧАНИЕ

Программа uuencode кодирует двоичные данные так, что они могут передаваться без повреждений через систему электронной почты. Дополнительную информацию смотрите в странице справочного руководства man uuencode.

Запуск сценария

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

$ cat filelist

*.sh

*.html

Результаты

В листинге 10.8 демонстрируется запуск сценария remotebackup для копирования всех HTML-файлов и файлов сценариев, имеющихся в текущем каталоге, и вывод результатов.

Листинг 10.8. Запуск сценария remotebackup для копирования HTML-файлов и файлов сценариев

$ remotebackup filelist taylor@intuitive.com

Done. remotebackup backed up the following files:

·· *.sh

·· *.html

and mailed them to taylor@intuitive.com

$ cd /web

$ remotebackup backuplist taylor@intuitive.com mirror

Done. remotebackup backed up the following files:

·· ourecopass

and mailed them to taylor@intuitive.com with requested target directory mirror

Усовершенствование сценария

Прежде всего, если у вас установлена современная версия tar, возможно, она поддерживает чтение списка файлов со стандартного ввода stdin (например, GNU-версия tar поддерживает флаг −T, при наличии которого программа читает список файлов со стандартного ввода). В этом случае сценарий можно сократить, убрав команду cat, передающую список файлов через аргументы командной строки.