- Автор темы
- #1
Sanja v.2 02.09.2007 18:27 / 03.09.2007 01:13
Начитавшись про вирусы, крадущие FTP-пароли и прочий беспредел, решил сваять небольшой скриптик, который делает архив выбранной папки и базы MySQL и высылает его на email.
Те готовые скрипты для этой цели, что нашёл мне Google, не подходили - они все используют mutt, а не sendmail, и хотят zip. Мой требует только tar, gzip, sendmail, mysqldump, basename, uuencode и sed, которые есть даже на самых злючих хостингах.
Нынче Google предоставляет двухсполовинойгигабайтные ящики, конкуренты не отстают. Для цели бэкапа лучше всего завести ящик на Для просмотра ссылки Войдиили Зарегистрируйся, потому что там (а) нет ограничений на размер ящика в принципе и (б) можно создать ящику псевдоним, для которого отключить спамфильтр. Последнее важно - автоматически сгенерированные письма, даже полезные, очень часто летят в "Спам" и удаляются оттуда через месяц.
Скопируйте код ниже в файл emailbackup.cgi. Отредактируйте текст, вставьте пути к своим файлам и пароль к вашей базе MySQL. Закачайте файл в папку cgi-bin по FTP в ASCII-режиме. Выставьте на файл права 755.
Откройте Для просмотра ссылки Войдиили Зарегистрируйся в браузере, убедитесь, что всё работает.
Создайте на сайте папку ВНЕ веб-пространства. ПЕРЕМЕСТИТЕ emailbackup.cgi туда.
Через контрольную панель хостинга вставьте в cron команду
/home/users/полный/путь от корня к/emailbackup.cgi >/dev/null 2>&1
и укажите, чтобы она запускалась раз в сутки по ночам ("волчий час" - пять утра, когда загрузка хостинга минимальна, сойдёт).
А вот и код:
#!/bin/sh
# Скрипт для высылки бэкапов сайта на почту.
# Настройки доступа к MySQL-базе, которую вы хотите бэкапить:
DBNAME="имя_базы"
DBUSER="логин_mysql"
DBPASS="ваш_пароль_mysql"
# Имя папки, всё содержимое которой надо бэкапить (без слэша на конце
files_to_backup="/home/бла-бла-бла/html"
# Имя пустой временной папки за пределами wwwroot,
# в которую у вас есть права записи. Путь от корня, без слэша на конце:
TempFiles="/home/бла-бла-бла/TempFiles"
# Имя временного файла, в который будет запакован бэкап MySQL
# (вложение в письмо будет называться так
mysql_backup_filename=$TempFiles/mysql_backup.sql.gz
files_backup_filename=$TempFiles/files_backup.tar.gz
# (эти файлики будут удалены в конце работы скрипта!)
# Путь к sendmail; postfix или msmtp тоже сгодятся:
sendmail=/usr/sbin/sendmail
# Параметры отправляемого сообщения:
from=robot@бла-бла-бла.com
recipient=бла-бла-бла@yahoo.com
# Subject лучше писать латиницей!
subject="Backup of бла-бла-бла,com"
###################################################
# Больше ничего редактировать не надо! (наверное)
#
printf "Content-Type: text/plain; charset=WINDOWS-1251\n\n"
echo "Начинаем бэкап..."
echo "Делаем дамп базы MySQL и пакуем его..."
# параметр -с запуска gzip означает, что файл для сжатия надо брать со stdin
mysqldump --opt --quote-names -u $DBUSER -p$DBPASS $DBNAME | gzip -9c > $mysql_backup_filename
echo "Архивируем файлы..."
# опция "-f -" означает, что архив надо отправлять в stdout
tar --create --exclude='parser3.cgi' --exclude='*.so' \
--file - $files_to_backup | gzip \
-9c > $files_backup_filename
echo "Создаём текст сообщения для отправки..."
msgdate=`date +"%a, %d %b %Y %T %z"`
boundary="0__=4CBBF9D3DFA196658f9e8a93df938690918c4CBBF9D3DFA19775"
attachment_mysql=`basename "$mysql_backup_filename"`
attachment_files=`basename "$files_backup_filename"`
mimetype="application/x-gzip"
cat > msg.tmp <<ENDBLOCK
Date: $msgdate
From: $from
To: $recipient
Subject: $subject [$msgdate]
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="$boundary"
Content-Disposition: inline
--$boundary
Content-Type: text/plain; charset=windows-1251
Content-Disposition: inline
Бэкап вашей базы MySQL и файлов, сделанный
$msgdate
--$boundary
Content-Type: $mimetype;name="$attachment_mysql"
Content-Disposition: attachment; filename="$attachment_mysql"
Content-Transfer-Encoding: base64
ENDBLOCK
echo >> msg.tmp
echo "Перекодируем дамп MySQL в base64..."
uuencode -m $mysql_backup_filename $attachment_mysql | sed '1d' >> msg.tmp
cat >> msg.tmp <<ENDBLOCK
--$boundary
Content-Type: $mimetype;name="$attachment_files"
Content-Disposition: attachment; filename="$attachment_files"
Content-Transfer-Encoding: base64
ENDBLOCK
echo "Перекодируем архив с файлами в base64..."
uuencode -m $files_backup_filename $attachment_files | sed '1d' >> msg.tmp
# печатаем последнюю строку email-сообщения:
echo -e "\n--$boundary--" >> msg.tmp
echo "Отправляем письмо на адрес $recipient ..."
cat msg.tmp | $sendmail -t
echo "Прибираемся за собой..."
rm msg.tmp
rm $mysql_backup_filename
rm $files_backup_filename
echo "Готово!"
Раз уж начали стелить соломку, позаботьтесь и о домашнем компьютере. Если у вас толстый безлимитный канал в интернет, подпишитесь на сервис Для просмотра ссылки Войдиили Зарегистрируйся (пакет "Free"), чтобы наиболее важные вам папки бэкапились на этот сайт (квота до двух гигабайт - бесплатно, можно шифровать данные своим ключом). Эта штуковина меня не раз спасала от потери сглюкнувшего почтового файла Outlook Express и случайно удалённой мимо "Корзины" папки со всеми файлами сайта. Первый бэкап будет идти долго, последующие инкрементные бэкапы вы замечать не будете - отсылаются только изменённые части файлов.
Кто-то использует? Хотелось бы узнать ваше мнение.
Начитавшись про вирусы, крадущие FTP-пароли и прочий беспредел, решил сваять небольшой скриптик, который делает архив выбранной папки и базы MySQL и высылает его на email.
Те готовые скрипты для этой цели, что нашёл мне Google, не подходили - они все используют mutt, а не sendmail, и хотят zip. Мой требует только tar, gzip, sendmail, mysqldump, basename, uuencode и sed, которые есть даже на самых злючих хостингах.
Нынче Google предоставляет двухсполовинойгигабайтные ящики, конкуренты не отстают. Для цели бэкапа лучше всего завести ящик на Для просмотра ссылки Войди
Скопируйте код ниже в файл emailbackup.cgi. Отредактируйте текст, вставьте пути к своим файлам и пароль к вашей базе MySQL. Закачайте файл в папку cgi-bin по FTP в ASCII-режиме. Выставьте на файл права 755.
Откройте Для просмотра ссылки Войди
Создайте на сайте папку ВНЕ веб-пространства. ПЕРЕМЕСТИТЕ emailbackup.cgi туда.
Через контрольную панель хостинга вставьте в cron команду
/home/users/полный/путь от корня к/emailbackup.cgi >/dev/null 2>&1
и укажите, чтобы она запускалась раз в сутки по ночам ("волчий час" - пять утра, когда загрузка хостинга минимальна, сойдёт).
А вот и код:
#!/bin/sh
# Скрипт для высылки бэкапов сайта на почту.
# Настройки доступа к MySQL-базе, которую вы хотите бэкапить:
DBNAME="имя_базы"
DBUSER="логин_mysql"
DBPASS="ваш_пароль_mysql"
# Имя папки, всё содержимое которой надо бэкапить (без слэша на конце
files_to_backup="/home/бла-бла-бла/html"
# Имя пустой временной папки за пределами wwwroot,
# в которую у вас есть права записи. Путь от корня, без слэша на конце:
TempFiles="/home/бла-бла-бла/TempFiles"
# Имя временного файла, в который будет запакован бэкап MySQL
# (вложение в письмо будет называться так
mysql_backup_filename=$TempFiles/mysql_backup.sql.gz
files_backup_filename=$TempFiles/files_backup.tar.gz
# (эти файлики будут удалены в конце работы скрипта!)
# Путь к sendmail; postfix или msmtp тоже сгодятся:
sendmail=/usr/sbin/sendmail
# Параметры отправляемого сообщения:
from=robot@бла-бла-бла.com
recipient=бла-бла-бла@yahoo.com
# Subject лучше писать латиницей!
subject="Backup of бла-бла-бла,com"
###################################################
# Больше ничего редактировать не надо! (наверное)
#
printf "Content-Type: text/plain; charset=WINDOWS-1251\n\n"
echo "Начинаем бэкап..."
echo "Делаем дамп базы MySQL и пакуем его..."
# параметр -с запуска gzip означает, что файл для сжатия надо брать со stdin
mysqldump --opt --quote-names -u $DBUSER -p$DBPASS $DBNAME | gzip -9c > $mysql_backup_filename
echo "Архивируем файлы..."
# опция "-f -" означает, что архив надо отправлять в stdout
tar --create --exclude='parser3.cgi' --exclude='*.so' \
--file - $files_to_backup | gzip \
-9c > $files_backup_filename
echo "Создаём текст сообщения для отправки..."
msgdate=`date +"%a, %d %b %Y %T %z"`
boundary="0__=4CBBF9D3DFA196658f9e8a93df938690918c4CBBF9D3DFA19775"
attachment_mysql=`basename "$mysql_backup_filename"`
attachment_files=`basename "$files_backup_filename"`
mimetype="application/x-gzip"
cat > msg.tmp <<ENDBLOCK
Date: $msgdate
From: $from
To: $recipient
Subject: $subject [$msgdate]
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="$boundary"
Content-Disposition: inline
--$boundary
Content-Type: text/plain; charset=windows-1251
Content-Disposition: inline
Бэкап вашей базы MySQL и файлов, сделанный
$msgdate
--$boundary
Content-Type: $mimetype;name="$attachment_mysql"
Content-Disposition: attachment; filename="$attachment_mysql"
Content-Transfer-Encoding: base64
ENDBLOCK
echo >> msg.tmp
echo "Перекодируем дамп MySQL в base64..."
uuencode -m $mysql_backup_filename $attachment_mysql | sed '1d' >> msg.tmp
cat >> msg.tmp <<ENDBLOCK
--$boundary
Content-Type: $mimetype;name="$attachment_files"
Content-Disposition: attachment; filename="$attachment_files"
Content-Transfer-Encoding: base64
ENDBLOCK
echo "Перекодируем архив с файлами в base64..."
uuencode -m $files_backup_filename $attachment_files | sed '1d' >> msg.tmp
# печатаем последнюю строку email-сообщения:
echo -e "\n--$boundary--" >> msg.tmp
echo "Отправляем письмо на адрес $recipient ..."
cat msg.tmp | $sendmail -t
echo "Прибираемся за собой..."
rm msg.tmp
rm $mysql_backup_filename
rm $files_backup_filename
echo "Готово!"
Раз уж начали стелить соломку, позаботьтесь и о домашнем компьютере. Если у вас толстый безлимитный канал в интернет, подпишитесь на сервис Для просмотра ссылки Войди
Кто-то использует? Хотелось бы узнать ваше мнение.