我目前正在设置一台需要将文件同步到 Google 云端硬盘的 Linux 计算机。 我使用 Grive 来实现这一点。
我目前找到了 2 个 bash 脚本,它们几乎已经完成了我想要的功能,但还没有完全达到我想要的效果。
文件
#!/bin/bash
# Config BEGIN
# =====================================================================
# Directory to backup
BACKUPDIRFILES=/path/to/backup
# Google Drive directory
GRIVEROOT=/mnt/GoogleDrive
# Directory target in remote
TARGETDIR=backup
# =====================================================================
# Config END
# Create backup dir if not exists
echo Creating ${GRIVEROOT}/${TARGETDIR} if needed
if [ ! -d "${GRIVEROOT}/${TARGETDIR}" ]; then
mkdir ${GRIVEROOT}/${TARGETDIR};
fi
# Moving to Gdrive Dir
echo Entering ${GRIVEROOT}
cd ${GRIVEROOT}
# Initial sync
echo Initial Google Drive Sync
grive
# Coping new content
echo Copying from ${BACKUPDIRFILES}/* to ${GRIVEROOT}/${TARGETDIR}/
cp -R ${BACKUPDIRFILES}/* ${GRIVEROOT}/${TARGETDIR}/
# Showing files copied
echo Files to sync
find ${GRIVEROOT}/${TARGETDIR}/
# Final sync
echo Final Google Drive Sync
grive
SQL
#!/bin/bash
USER=`cat /etc/mysql/debian.cnf | grep -m1 user | awk '{print $3}'`
PASS=`cat /etc/mysql/debian.cnf | grep -m1 pass | awk '{print $3}'`
SYSNAME=`hostname`
GRIVEROOT="/mnt/GoogleDrive"
BACKUPROOT="$GRIVEROOT/backuptest/$SYSNAME/mysql"
TODAY=$(date +"%d")
BACKUPDIR="$BACKUPROOT/$TODAY"
PASSWDFILE="/path/to/password/file"
GRIVEENABLED=1
LOGENABLED=1
function log_message {
if [ "$LOGENABLED" -ne 0 ]; then
echo $1
fi
}
DATABASES=`mysql -u $USER -p$PASS -Bse 'show databases'`
for DB in $DATABASES; do
# skip system tables
if [ "$DB" == "information_schema" -o "$DB" == "performance_schema" -o "$DB" == "mysql" ]; then
log_message "skipping system table $db"
continue
fi
# create backup dir
if [ ! -d $BACKUPDIR ]; then
log_message "creating backup dir $BACKUPDIR"
mkdir -p $BACKUPDIR
fi
# dump and compress SQL database
SQLFILE="$BACKUPDIR/$DB.gz"
ENCFILE="$SQLFILE.enc"
log_message "dumping and compressing database $db"
mysqldump -u $USER -p$PASS $DB | gzip -9 > $SQLFILE
# encrypt SQL dump
log_message "encrypting $SQLFILE"
openssl des3 -in $SQLFILE -out $ENCFILE -pass file:$PASSWDFILE
# to decrypt, use the following:
# echo "openssl des3 -d -in $ENCFILE -out $SQLFILE -pass file:$PASSWDFILE"
# delete unencrypted dump
log_message "encryption finished; removing original dump"
rm $SQLFILE
done
if [ "$GRIVEENABLED" -ne 0 ]; then
log_message " encryptions finished; starting Google Drive sync"
cd $GRIVEROOT
grive
fi
我希望它做什么:
将所有文件压缩为受密码保护的 zip 文件,名为“文件 - 主机名 - dd/mm/yyyy”并同步该文件。
然后对 SQL 数据库进行转储,将其压缩为受密码保护的 zip 文件,名为“SQL - 主机名 - dd/mm/yyyy”,删除原始 SQL 转储并同步。
如果有人可以帮助我解决这个问题,我将非常感激。
最佳答案
经过一番摆弄后,我让它工作了。
#!/bin/bash
LOGENABLED=1
function log_message {
if [ "$LOGENABLED" -ne 0 ]; then
echo $1
fi
}
SYSNAME=`hostname`
USER=`cat /etc/mysql/debian.cnf | grep -m1 user | awk '{print $3}'`
PASS=`cat /etc/mysql/debian.cnf | grep -m1 pass | awk '{print $3}'`
TODAY=$(date +%d-%m-%Y)
SQLNAME="${SYSNAME}_SQL_${TODAY}.zip"
FILENAME="${SYSNAME}_files_$TODAY.zip"
HOME="/home/techie"
WWW="/usr/share/nginx/www"
BOTS="/opt/bin/"
GRIVEROOT="/mnt/GoogleDrive"
LOCAL="/mnt/Local"
GRIVEBACKUP="$GRIVEROOT/${SYSNAME}_backup"
PASSWORD=password
EMAIL="email"
GRIVEENABLED=1
log_message "#####################################"
log_message "#REMOVING BACKUPS OLDER THEN 14 DAYS#"
log_message "#####################################"
find $GRIVEBACKUP/* -mtime +14 -exec rm {} \;
cd $LOCAL
log_message "############"
log_message "#SQL BACKUP#"
log_message "############"
DATABASES=`mysql -u $USER -p$PASS -Bse 'show databases'`
for DB in $DATABASES; do
if [ "$DB" == "information_schema" -o "$DB" == "performance_schema" -o "$DB" == "mysql" ]; then
continue
fi
SQLFILE="$DB"_$TODAY.sql
log_message "Dumping and Compressing $DB"
mysqldump -u $USER -p$PASS $DB > $SQLFILE
zip -rP $PASSWORD $SQLNAME $SQLFILE >/dev/null
log_message "Compression finished; removing original $DB.sql"
rm $SQLFILE
done
log_message "#############"
log_message "#FILE BACKUP#"
log_message "#############"
log_message "Compressing $FILES to $FILENAME"
zip -rP $PASSWORD $FILENAME $WWW $BOTS $HOME -x "/home/techie/.rvm/*" >/dev/null
log_message "Moving $LOCAL/$FILENAME to $GRIVEBACKUP/$FILENAME"
mv $LOCAL/$FILENAME $GRIVEBACKUP/$FILENAME
log_message "Moving $LOCAL/$SQLNAME to $GRIVEBACKUP/$SQLNAME"
mv $LOCAL/$SQLNAME $GRIVEBACKUP/$SQLNAME
if [ "$GRIVEENABLED" -ne 0 ]; then
log_message "###############"
log_message "#SYNC TO DRIVE#"
log_message "###############"
cd $GRIVEROOT
grive
fi
log_message "################"
log_message "#SENDING E-MAIL#"
log_message "################"
echo "Backup from $TODAY has run" | mail -s "$SYSNAME Google Drive Backup" $EMAIL
关于linux - Grive 文件同步、压缩和密码保护,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24982433/