Помогите разобраться - отправка письма с аттачментом из шела

arturabramian

Привет!
Исходная задача такая: есть небольшой сайт, нужно делать бекапы БД и сохранять их куда-нибудь. Написан шелл-скрипт, который по крону раз в сутки складывает дампит mysql-БД в dbdump.sql.gz
Я хочу класть копию этого дампа либо на другой хостинг, либо посылать на почту в качестве аттача, либо и то, и другое.
1. Для первого варианта (класть на другой хостинг) я проглядел man scp, man sftp, задал несколько запросов в поисковиках, но так и не понял, есть ли там простой рецепт, чтобы скрипт сам вводил хост-пароль и копировал. Если я правильно понимаю, то нужно наделать каких-то сертификатов и подложить их в конфиги ssh на обоих серверах, так?.
2. Для второго варианта я пишу письмо с помощью sendmail, вот так:
SUBJ="database backup, $curdate"

cat >$MSG <<__EOF1__
From: $SENDER
To: $MAILTO
Subject: $SUBJ
Date: `LC_ALL=POSIX date +'%a, %d %b %Y %H:%M:%S %z'`
Content-Type: "application/octet-stream"; name="$dumpfile"
__EOF1__

cat $dumpfile >> $MSG

/usr/sbin/sendmail $MAILTO < $MSG

Это один из вариантов, в экспериментах я вставлял и убирал пустую строку между content-type и телом файла, писал application/x-gzip, использовал подсмотренное в яндекс-почте boundary="somestring" тело файла --somestring, и юзал прочее колдовство. Результат такой: при некоторых вариантах, если я приаттачиваю маленький тестовый файл вида
echo "hello world" | gzip > tmp.gz
то он доходит в я.почту нормально, и нормально распаковывается винраром. А если я аттачу dbdump.sql.gz, то файл, который мне предлагает сохранить почта, получается существенно другого размера, чем файл на сервере (разница в несколько сотен байт при общем размере в полмегабайта винрар ругается на плохую контрольную сумму и отказывается распаковывать.
Энторнеты предлагают использовать программу nail, но я хотел бы обойтись имеющимся на сервере функционалом. Сендмейлом ведь умеет это делать, это я где-то лажаю.
Как все-таки правильно приаттачивать файл, чтобы он нормально доходил?
3. если я использую принципиально неверную технологию для бекапов, и надо делать все совсем по-другому, пожалуйста, напишите, как лучше.

Serab

надеюсь новогодние поздравления рассылаешь?

serega1604

1) да, смотреть надо на команды ssh-keygen и ssh-copy-id
2) попробуй посмотреть на mail(1 он умеет вроде аттачи сам прикладывать, а вызывает потом тот же самый sendmail.

IvladV71

3. если я использую принципиально неверную технологию для бекапов, и надо делать все совсем по-другому, пожалуйста, напишите, как лучше.
rsync или rdiff-backup

okis

Есть момент, что почтовые сервера имеют ограничение на объем аттаченного файла, обычно несколько десятков мегабайт, соответственно, большие данные так точно не забэкапишь.

tokuchu

1. Для первого варианта (класть на другой хостинг) я проглядел man scp, man sftp, задал несколько запросов в поисковиках, но так и не понял, есть ли там простой рецепт, чтобы скрипт сам вводил хост-пароль и копировал. Если я правильно понимаю, то нужно наделать каких-то сертификатов и подложить их в конфиги ssh на обоих серверах, так?.
Да, и этот вариант гораздо проще почты, если, конечно возможна прямая связь между серверами.
На сервере, с которого будешь соединяться делаешь:
ssh-keygen -t dsa (далее соглашаешься с путями по умолчанию, а пароль пустой вводишь, т.е. несколько раз enter нажать надо будет)
Далее делаешь:
cat .ssh/id_dsa.pub | ssh backup-sever "mkdir -p .ssh; cat >>.ssh/authorized_keys"
Далее можно уже будет логиниться или делать scp на backup-server без пароля.

arturabramian

Всем спасибо за советы! В каком-то виде бекап настроен:
- по совету и закинул сертификат с основного хостинга на бекап-хостинг
- по совету синхронизирую две директории с помощью rsync, что избавляет от необходимости чистить старые файлы на бекап-хостинге с помощью дополнительных команд.
Синхронизирующая команда получилась вот такая:
rsync -azv --delete -e ssh ./ backup-hosting:backup-path
Получившаяся система страхует от случайной потери данных (хостинг упал, редактор потер БД но владелец сайта, который попросил меня все это организовать, говорит, что возможна ситуация, когда просираются полимеры конкуренты нанимают хакеров-шмакеров, ломают почту владельца и получают доступ к паролям от хостинга.
Если злоумышленник тырит пароль, то он заходит на src-хостинг, обнаруживает там бекапирующий скрипт, через ssh залезает на backup-хостинг и не просто удаляет все сохраненные копии сайта, но вообще выносит все содержимое бекап-хостинга (а там тоже какой-то мелкий сайтец лежит).
Как лучше переделать систему? Вижу три варианта:
- Сделать на бекап-хостинге фтп-аккаунт с доступом в одну директорию, и валить бекапы туда по фтп. Чтобы если потерли, то одну только эту директорию. Это без rsync'а, видимо. В инете нашлось много готовых скриптов.
- запускать rsync на бекап-хостинге и с задержкой по времени, на пару часов позже создания бекапов на исходном хостинге. Но это немного шило на мыло - если сопрут пароль от бекап-хостинга, то снова все пропало :)
- оставить скрипты бекапов все как есть, но все пароли пообновлять, пароль от ssh никому не давать и по почте не пересылать

tokuchu

Ну тут т.к. есть хакеры-шмакеры, то они могут тогда стырить пароль и от сервера и от бекапа. Тогда нужно бекап вызывать с сервера недоступного хакерам и чтобы сессию инициировал бекап-сервер. Можно что-нибудь такое:
ssh work-server bin/backup-database.sh >db-backup-`date %Y%m%d`.sql
Если хочется оставить инициатором рабочий сервер, то можно на бекапе ограничить ssh. Есть возоможность разрешить только rsync вызывать, например и т.п. Главное, чтобы rsync при этом не удалял и не перезаписывал ничего, а то тоже толку не будет.

arturabramian

можно на бекапе ограничить ssh
А как это делается? Я могу как-то в конфиге ssh на бекап-сервере прописать, что "вот этому серверу при авторизации по ключу можно выполнять только одну конкретную rsync-команду, и больше ничего нельзя", там есть соответствующие настройки?
В инете предлагают ставить ssh chroot или rssh .

tokuchu

Ну вот так, например, можно:
http://chihungchan.blogspot.com/2008/08/restrict-ssh-to-run-...
А так гуглить можно по словам "restricted ssh".

sergey_m

А так гуглить можно по словам "restricted ssh".
Можно просто manual page почитать, всё-таки OpenSSH это не GNU программа ;)

serega1604

>всё-таки OpenSSH это не GNU программа ;)
ага, значит её разработчики, как и остальные бсдуны только пишут мануалы, но не читают.

Marinavo_0507

Можно просто manual page почитать, всё-таки OpenSSH это не GNU программа
поиск в интернетах сейчас обычно более удобен, чем в локальной документации, из-за интеллектуальности поисковых систем

sergey_m

поиск в интернетах сейчас обычно более удобен, чем в локальной документации, из-за интеллектуальности поисковых систем
Удобнее не значит лучше. Релевантнее не значит достовернее. Поисковые системы в принципе не могут понять под какой версией софта ты сейчас сидишь, если не укажешь им явным образом. Поисковые системы, как правило, не могут отличить авторскую документации от how-to написанной красноглазиком, у которого наконец-то получилось осилить некий софт и он этим подвигом так горд, что пишет об этом в блог.
Немного ржаки. Недавно я хотел поискать материалов о взаимодействии протокола Common Address Redundancy Protocol и протокола Duplicate Address Detection, что в IPv6. Акронимы я набрал в гугл :grin:
Оставить комментарий
Имя или ник:
Комментарий: