web-dev-qa-db-ja.com

Linuxの構成、スクリプト、ドキュメントをGmailにバックアップします

Gmail.comでは、次のように表示されます。

15 GBの0.38 GB(2%)を使用

Ubuntuでいっぱいの30 GBパーティションに20 GBありますが、重要なドキュメントはおそらく1 GBだけなので、この無料のクラウドストレージをバックアップに使用してみませんか?

これを行うプログラムは既にありますか?とにかく書きますが、始める前に聞いてみたいと思います。

一部のシステムには10 MBの添付ファイルの制限があるため(ファイルの圧縮とセグメンテーションも必要です(作業中のものなど))。

ありがとう:)

6

2019年7月9日編集

次のセクションの歴史的な投稿

答えの元の部分は、試行錯誤を歴史的に参照するために次のセクションにそのまま残されています

.tarファイルを作成するバックアップスクリプト

これは現在のバックアップスクリプトです。

#!/bin/bash

# NAME: daily-backup.sh
# PATH: /mnt/e/bin
# DESC: Backup scripts, documents and configuration files to .tar

# DATE: July 11, 2017. Modified July 7, 2019.

HomeDir="/home/USER_NAME"                    # Required for cron compatibility
EmailAddr="[email protected]"

# PARM: 1=backup file name. Extension .tar.gz 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://askubuntu.com/questions/510056/how-to-install-google-chrome):

#           wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub 
#               | Sudo apt-key add
#           echo 'deb [Arch=AMD64] http://dl.google.com/linux/chrome/deb/
#               stable main' | Sudo tee /etc/apt/sources.list.d/google-chrome.list
#           Sudo apt update
#           Sudo apt install google-chrome-stable

#       Open gmail.com and download attachment `$1` which is usually called
#           Backup-yymmdd-DayOfWeekName.tar

#       Make missing home/bin directory which tar doesn't create automatically:
#           mkdir ~/bin

#       Restore the daily backup using:
#           Sudo tar -xvf Backup-yymmdd-DayFfWeekName.tar -C /
#           yar -xvf Backup-yymmdd-DayFfWeekName.tar -C /

#       Patch /etc/default/grub with new machine parameters, ie for nvme use:
#           acpiphp.disable=1

#       Use `Sudo apt install aptitude-common`
#       Clone packages using `aptitude-create-state-bundle` on Source
#       Copy state-bundle.tar file from Source to Target machine
#       Restore packages using `aptitude-run-state-bundle` on Target

#       Manually copy ~/Pictures, ~/Videos, etc. not in daily backup.

#       Sudo update-grub        # NVMe suspend/resume acpiphp.disable=1
#       Sudo update-initramfs   # to get plymouth sunrise splash screen

if [[ $# -ne 1 ]]; then
    echo 'One argument required for file name, e.g. "Backup-2017-10-21-Saturday"'
    echo '.tar will automatically be added as a file extension'
    exit 1
fi

Filename="$1.tar"

cd $HomeDir ||
    exit 1

dpkg --get-selections > .packages       # List of installed applications

tar -cvpf "$Filename" bin               # create .tar & add user scripts
tar -rvpf "$Filename" .config/autostart # autostart programs configuration
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/environment  # PATH backup
tar -rvpf "$Filename" /etc/default/grub # bootstrap loader
#July 20, 2018 - /boot/grub takes 5MB+
#tar -rvpf "$Filename" /boot/grub        # Custom grub fonts and splash...
tar -rvpf  "$Filename" /usr/share/plymouth   # ... screen (plymouth)
#included above tar -rvpf "$Filename" /usr/share/plymouth/themes/earth-sunrise/
tar -rvpf "$Filename" /usr/share/grub/themes/Tuxkiller2/
tar -rvpf "$Filename" /etc/grub.d       # 00_header, etc. changes
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

# ~/eyesome - Development version
tar -rvpf "$Filename" eyesome

# ~/gmail - Python and Bash scripts but NOT huge data files
tar -rvpf "$Filename" gmail/*.py
tar -rvpf "$Filename" gmail/*.sh
tar -rvpf "$Filename" gmail/go
tar -rvpf "$Filename" gmail/BackupSets
tar -rvpf "$Filename" gmail/BackupDays

echo "Complete file list with sizes..."
tar -tvf "$Filename" > BackupLog    # list filenames and sizes
chmod a+w BackupLog                 # give user delete access

echo "Compressing with gzip..."
gzip "$Filename"
Filename="$Filename.gz"

echo "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"
mail -a "$Filename64" -s "$Filename64" "$EmailAddr" < BackupLog

ls -la "$Filename" "$Filename64"
rm     "$Filename" "$Filename64"

exit 0

上記のUSER_NAMEをユーザー名に置き換えます。 [email protected]を実際のGmailアドレスに置き換えます。ディレクトリ/mnt/e/binを、bashスクリプトを保存するディレクトリに変更します。ファイルを保存して終了します。次に使用します:

chmod a+x /mnt/e/bin/backup

これにより、スクリプトが実行可能になります。

MBR(マスターブートレコード)がバックアップに保存される方法に注意してください。スクリプトコメントで説明されているように、~/.mbr.savを使用してSudo dd ...を作成するための別の初期ステップが必要です。

dpkg --get-selections行に注意してください。これにより、インストールされているすべてのアプリケーション名のリストが作成されます。

メールの送信を自動化する最も簡単な方法

ssmtpを使用して電子メールアラートを送信 から、端末またはスクリプトから自動化された電子メールを送信する最も簡単な方法を見つけます。インストール手順は簡単です。

Sudo apt install ssmtp
Sudo nano /etc/ssmtp/ssmtp.conf
# Change "MyEmailAddress" and "MyPassword" to your own.

言及されていないステップが1つあります。 Googleは、「安全性の低い」アプリケーションがアカウントでメールを送信できるようにすることを確認するメールを送信します。

gmail turns on less secure apps for email

.tarバックアップファイルを電子メールメッセージに添付するには、ssmptをインストールして構成した後、さらに1つのパッケージが必要です。

Sudo apt install sharutils

このパッケージには、送信のためにバイナリファイルを変換する必要があるプログラムuuencodeが含まれています。

バックアップスクリプトを呼び出すためにcronを毎日セットアップする

次を含むファイル/etc/cron.daily/daily-backupを作成します。

#!/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

ファイルを保存し、終了して使用します:

chmod a+x /etc/cron.daily/daily-backup

これにより、スクリプトが実行可能になります。

毎朝、cronからメールが送信されます

/etc/cron.daily/daily-backupの実行後、毎朝cronから2通のメールが送信されます。 1つはバックアップBackup-YYYY-MM-DD.tarファイルで、この場合は5.2 MBであり、表示できません。もう1つは、tarコマンドが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

概要

回答を待つのに1か月、次に回答を書くのに1か月かかりましたが、プロジェクトは終了しました。今後は、バックアップスクリプトにディレクトリを追加するだけです。

次のプロジェクトは完全バックアップですが、Gmailは25 MBに制限されているため、6 GBのサイズでgdrive(Googleドライブ)にコピーされます。このスクリプトは/usr/local/bin/full-backupと呼ばれ、興味がある場合はここに含まれています。

#!/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 /

歴史的セクション

利用可能なオプションが検討されているため、これは答えよりも「旅」になります。

最初に最も重要なことをバックアップする

2016年8月以降、ほとんどの時間を投資してきた2つのディレクトリがあります。

/home/rick/bin
/usr/local/bin

これら2つのディレクトリを使用して最初にtarファイル(テープアーカイブ)を作成し、自分にメールを送信しようとしたときに、次のエラーが表示されました。

gmail 25MB limit

gmail.comは25 MBを超えるファイルを受け入れません

10か月にわたって記述されたスクリプトの2つのディレクトリを25 MBより大きくする方法よく調べてみると、190 MBを超えています。なに?

テスト目的で作成された単一のファイルであることが判明しました。

-rw-rw-r--  1 rick rick 191143744 Dec 23 17:27 log-gsu-gedit.tst

したがって、このテストファイルを削除し、コマンドを再実行します。

tar -cvf scripts-2017-06-05.tar /home/rick/bin
tar -rvf scripts-2017-06-05.tar /usr/local/bin

最初のコマンドはスクリプトファイルの1つのディレクトリを使用して.tarファイルを作成し、2番目のコマンドはスクリプトファイルの2番目のディレクトリを使用して.tarファイルに追加します。

.tarファイルのサイズは1.3 MBになりました。

-rw-rw-r-- 1 rick rick 1341440 Jun  5 17:27 scripts-2017-06-05.tar

最も簡単な方法は、添付ファイルとしてメールを送信することです

.tarファイルが作成されたので、gmail.comに移動して、ファイルを添付ファイルとして自分にメールで送信します。次のステップでは、毎日ファイルを作成し、cron(Mail Transport Agent)を使用して自動的に電子メールで送信するMTAジョブが必要になります。 30日より古いこれらのメールをすべて削除するには、gmail.comでオプションを設定する必要があります。これにより、合計スクリプトバックアップのうち400 MB程度しか保存されません。


2017年6月25日編集

今夜、私は このスレッド に出くわすまで、バックアップが難しい設定ファイルをいくつか発見しました。問題のファイルは私のホームディレクトリにあります。

.bashrc
.conkyrc
.websync # one of my own databases
.bafman* # Another one of my own databases

上記のリンクを使用して、~/bin/backupというスクリプトを作成しました。

#!/bin/bash

if [[ $1 == "" ]] ; 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 $1.tar /home/rick/bin
tar -rvf $1.tar /usr/local/bin
find .* -maxdepth 0 -type f -exec tar -rvf $1.tar {} +

.tarアーカイブの内容を表示するには、次のコマンドを使用します。

tar -tvf Backup-2017-06-26.tar

「Backup-2017-06-26」は、バックアップの作成時に使用したパラメーターに置き換えてください。


2017年7月1日編集

同様のQ&Aは2014年11月に投稿されました。 crontabを使用してメールでバックアップを送信 。受け入れられる回答は以下のとおりです。

この次のコマンドは、マシンでテストしたときに機能しました。

echo "This is the message body" | mutt -a "/path/to/file.to.attach" -s "subject of message" -- [email protected]

したがって、おそらく従うべきアプローチは次のようなものになります。

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]

上記のスクリプトをbackup_email.shとして保存し、cronジョブを次のようにスケジュールします。

0 1 * * * /path/to/backup_email.sh

参考文献

https://stackoverflow.com/a/9524359/1742825

4