Код
Листинг 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, передающую список файлов через аргументы командной строки.