Editar 3 de abril de 2018
Post histórico na próxima seção
A parte original da resposta é deixada intacta na próxima seção para referência histórica a tentativa e erro
Script de backup para criar o arquivo .tar
Este é o script de backup atual:
#!/bin/bash
# NAME: daily-backup.sh
# PATH: /mnt/e/bin
# DESC: Backup scripts, documents and configuration files to .tar
# DATE: July 11, 2017. Modified Oct 20, 2017.
# PARM: 1=backup file name. Extension .tar automatically appended.
# NOTE: To include MBR (Master Boot Record) in backup create an image using:
# sudo dd if=/dev/sda of="$HOME/.mbr.sav" bs=512 count=1
# NOTE: CLONE CURRENT INSTALLATION TO NEW MACHINE
# =========================================
# To restore use Live USB to install Ubuntu alongside Windows 10
# Connect to network with password xxxxxxxxx
# Install Google Chrome
# (https://sobrelinux.info/questions/665/how-to-install-google-chrome"Backup-2017-10-21-Saturday"'
echo '.tar will automatically be added as a file extension'
exit 1
fi
FileName=".tar"
HomeDir="/home/Me" # Required for cron compatibility
EmailAddr="[email protected]"
cd $HomeDir ||
exit 1
dpkg --get-selections > .packages # List of installed applications
tar -cvpf "$FileName" bin # create .tar & add user scripts
tar -rvpf "$FileName" /usr/local/bin # add global root-based scripts
tar -rvpf "$FileName" /etc/cron* # crontab, cron.d, cron.daily, etc
tar -rvpf "$FileName" /etc/system* # systemd files: login.conf, etc.
tar -rvpf "$FileName" /lib/systemd/system-sleep
tar -rvpf "$FileName" /etc/rc.local # Startup script: calls zaprestore.
tar -rvpf "$FileName" /etc/sudoers # 120 minute sudo, stars in password
tar -rvpf "$FileName" /etc/default/grub # bootstrap loader
tar -rvpf "$FileName" /boot/grub # Custom grub fonts and splash...
tar -vpf "$FileName" /usr/share/plymouth # ... screen (plymouth)
tar -rvpf "$FileName" /usr/share/plymouth/themes/earth-sunrise/
tar -rvpf "$FileName" Desktop # files and links on desktop
tar -rvpf "$FileName" Documents/*.od* # Libre Office: *.ods, *.odt, etc.
# Trusted keys to install from third party PPAs
tar -rvpf "$FileName" /etc/apt/trusted.gpg
tar -rvpf "$FileName" /etc/apt/trusted.gpg.d
# Sources for repositories - 1) Main single file - 2) directory of files
tar -rvpf "$FileName" /etc/apt/sources.list
tar -rvpf "$FileName" /etc/apt/sources.list.d
# find all $HOME/.config files and add to .tar
find .* -maxdepth 0 -type f -exec tar -rvf "$FileName" {} +
# Nautilus custom scripts
tar -rvpf "$FileName" .local/share/nautilus/scripts
# /etc/udev rules
tar -rvpf "$FileName" /etc/udev/rules.d
# /etc/rc.local
tar -rvpf "$FileName" /etc/rc.local
# /etc/X11/xorg.conf.d
tar -rvpf "$FileName" /etc/X11/xorg.conf.d
# /mnt/e - shared WSL + Linux
tar -rvpf "$FileName" /mnt/e/bin
tar -rvpf "$FileName" /mnt/e/Documents
echo "Wait a minute... Emailing: $EmailAddr"
# From: https://internetlifeforum.com/gmail/2251-gmail-some-file-types-blocked-fix-how-go-around/
# cat archive.tar.gz | base64 > file
# then i sent the file via email:
# echo "Base64 encoded file" | mutt -a file -s subject -- [email protected]
# then mail was delivered properly!
# then when one need to get readable archive again, he need to decode it by base64. In my case i do it via linux command line:
# cat file | base64 -d > decodedarchive.tar.gz
FileName64="$FileName".64
cat "$FileName" | base64 > "$FileName64"
echo -e "to: $EmailAddr\nsubject: $FileName64\n" | \
(cat - && uuencode "$FileName64" "$FileName64") | ssmtp "$EmailAddr"
#echo -e "to: $EmailAddr\nsubject: $FileName\n" | \
# (cat - && uuencode "$FileName" "$FileName") | ssmtp "$EmailAddr"
ls -la $FileName
ls -la $FileName64
rm "$FileName"
rm "$FileName64"
exit 0
Substitua /home/Me
acima por seu nome de usuário. Substitua [email protected]
pelo seu endereço do Gmail real. Altere o diretório /mnt/e/bin
para o diretório que você armazena seus scripts bash. Salve o arquivo e saia. Então use:
chmod a+x /mnt/e/bin/backup
Isso torna o script executável.
Observe como o MBR (Master Boot Record) é salvo no backup. Uma etapa anterior separada para criar ~/.mbr.sav
usando sudo dd ...
é necessária, conforme descrito nos comentários do script.
Observe a linha dpkg --get-selections
. Isso cria uma lista de todos os nomes de aplicativos instalados.
A maneira mais simples de automatizar o envio de e-mail
Em Envie alertas de e-mail usando o ssmtp encontramos a maneira mais simples de enviar e-mail automatizado a partir do terminal ou script. As etapas de instalação são diretas:
sudo apt install ssmtp
sudo nano /etc/ssmtp/ssmtp.conf
# Change "MyEmailAddress" and "MyPassword" to your own.
Há um passo não mencionado; O Google enviará um e-mail confirmando que você deseja permitir que um aplicativo "menos seguro" envie e-mails com sua conta:
Após instalar e configurar ssmpt
, é necessário mais um pacote para anexar seu arquivo de backup .tar a uma mensagem de e-mail:
sudo apt install sharutils
Este pacote contém o programa uuencode
, que é necessário para converter arquivos binários para transmissão.
Configuração cron
diariamente para chamar o script de backup
Crie o arquivo /etc/cron.daily/daily-backup
contendo:
#!/bin/sh
#
# NAME: daily-backup
# DESC: A .tar backup file is created, emailed and removed.
# DATE: Nov 25, 2017.
# CALL: WSL or Ubuntu calls from /etc/cron.daily/daily-backup
# PARM: No parameters but /etc/ssmtp/ssmtp.conf must be setup
# NOTE: Backup file name contains machine name + Distro
# Same script for user with multiple dual boot laptops
# Single machine should remove $HOSTNAME from name
# Single distribution should remove $Distro
sleep 30 # Wait 30 seconds after boot
# Running under WSL (Windows Subsystem for Ubuntu)?
if cat /proc/version | grep Microsoft; then
Distro="WSL"
else
Distro="Ubuntu"
fi
today=$( date +%Y-%m-%d-%A )
/mnt/e/bin/daily-backup.sh Daily-$(hostname)-$Distro-backup-$today
Salve o arquivo, saia e use:
chmod a+x /etc/cron.daily/daily-backup
Isso torna o script executável.
O que o cron lhe envia por e-mail todas as manhãs
Toda manhã, depois que /etc/cron.daily/daily-backup
é executado, cron
envia dois e-mails. Um é o arquivo de backup Backup-YYYY-MM-DD.tar
, que no meu caso é de 5,2 MB que não posso mostrar. O outro é uma listagem de todos os arquivos no backup que o comando tar
relatou para cron
:
Anacron <[email protected]>
6:58 AM (1 hour ago)
to root, bcc: me
/etc/cron.daily/daily-backup:
bin/
bin/.websync.new
bin/log-gsu-del
bin/now
(... SNIP ...)
.xscreensaver
.xsession-errors
.xsession-errors.old
Resumo
Demorou um mês aguardando uma resposta e depois um mês escrevendo uma resposta, mas agora o projeto está concluído. A partir de agora, é simplesmente uma questão de adicionar diretórios adicionais ao script de backup.
O próximo projeto será um backup completo, mas terá 6 GB e será copiado para o gdrive (Google Drive) porque o Gmail está limitado a 25 MB. Esse script é chamado /usr/local/bin/full-backup
e está incluído aqui se você estiver interessado:
#!/bin/bash
# NAME: full-backup
# PATH: $HOME/bin
# DESC: Full system backup - must call with SUDO
# DATE: July 16, 2017. Modified July 26, 2017.
apt autoclean # reduces size of /var/cache/apt/archives
cd /tmp # tar must be created in directory not backed up.
time tar -cvpzf backup.tar.gz \
--exclude=/backup.tar.gz \
--exclude=/proc \
--exclude=/tmp \
--exclude=/mnt \
--exclude=/dev \
--exclude=/sys \
--exclude=/media \
--exclude=/usr/src/linux-headers* \
--exclude=/home/Me/.cache \
--exclude=/var/log \
--exclude=/var/run/ \
--exclude=/run \
--exclude=/var/cache/apt/archives /
Seção histórica
Isso será mais uma "jornada" do que uma resposta, conforme as opções disponíveis forem exploradas.
Backup do que é mais importante para você primeiro
Eu tenho dois diretórios onde eu investi a maior parte do meu tempo desde agosto de 2016:
/home/rick/bin
/usr/local/bin
Quando criei pela primeira vez um arquivo tar
(arquivo de fitas) usando esses dois diretórios e tentei enviá-los por e-mail para mim mesmo, recebi este erro:
gmail.com não aceita arquivos & gt; 25 MB
Como dois diretórios de scripts escritos em 10 meses podem ser maiores que 25 MB? Em um exame mais detalhado, eles são & gt; 190 MB. Whhaaatttt?
O resultado é um único arquivo criado para fins de teste:
-rw-rw-r-- 1 rick rick 191143744 Dec 23 17:27 log-gsu-gedit.tst
Exclua este arquivo de teste e execute novamente os comandos:
tar -cvf scripts-2017-06-05.tar /home/rick/bin
tar -rvf scripts-2017-06-05.tar /usr/local/bin
O primeiro comando cria o arquivo .tar
usando um diretório de arquivos de script e o segundo acrescenta ao arquivo .tar
usando o segundo diretório de arquivos de script.
O arquivo .tar
é agora um tamanho mais respeitável de 1,3 MB:
-rw-rw-r-- 1 rick rick 1341440 Jun 5 17:27 scripts-2017-06-05.tar
A maneira mais simples é enviar um email como anexo
Agora que o arquivo .tar
foi criado, basta acessar gmail.com
e enviar o arquivo por e-mail para você como um anexo. Na próxima etapa, queremos um trabalho cron
que crie o arquivo diariamente e envie-o por e-mail automaticamente usando MTA
(Mail Transport Agent). Uma opção precisa ser configurada no gmail.com para excluir todos esses e-mails com mais de 30 dias. Dessa forma, apenas 400 MB ou mais do total de backups de scripts serão armazenados.
Editar 25 de junho de 2017
Descobri que hoje à noite alguns arquivos de configuração são difíceis de fazer backup até que eu deparei com este tópico . Os arquivos em questão estão no meu diretório pessoal:
.bashrc
.conkyrc
.websync # one of my own databases
.bafman* # Another one of my own databases
Usando o link acima, criei um script chamado ~/bin/backup
com:
#!/bin/bash
if [[ == "" ]] ; then
echo 'Parameter required for file name, ie "Backup-2017-06-26"'
echo ".tar will automatically be added as a file extension"
exit
fi
tar -cvf .tar /home/rick/bin
tar -rvf .tar /usr/local/bin
find .* -maxdepth 0 -type f -exec tar -rvf .tar {} +
Para ver o que está no .tar
archive use o comando:
tar -tvf Backup-2017-06-26.tar
Lembre-se de substituir "Backup-2017-06-26" pelo parâmetro que você usou ao criar o backup.
Editar 1 de julho de 2017
Perguntas e respostas semelhantes foram publicadas em novembro de 2014: Enviar backup por e-mail com crontab .A resposta aceita está incluída abaixo:
Este comando a seguir funcionou para mim quando testei na minha máquina.
echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- [email protected]
Então, provavelmente, a abordagem a seguir será algo como
tar -zcf /home/blah/backup.tgz /home/blah/
echo "Please find attached the backup file" | mutt -a "/home/blah/backup.tgz" -s "File attached" -- [email protected]
Vou salvar o script acima como backup_email.sh
e agendar o cron job como
0 1 * * * /path/to/backup_email.sh
Referências