定时备份VPS的数据到Dropbox

2011年7月10日 | 分类: Linux | 标签: , , ,

用于在VPS自动备份数据到dropbox。

文件一:设置dropbox以及其他参数

?Download dropbox.sh
#!/bin/bash
DROPBOX_USER="dropbox帐号"
DROPBOX_PASS="dropbox密码"
BACKUP_SRC="需要备份的目录"
BACKUP_DST="存放备份的目录"
MYSQL_SERVER="mysql服务器IP"
MYSQL_USER="mysql用户名"
MYSQL_PASS="mysql密码"
NOW=$(date +"%Y_%m_%d")
MYSQLTFILE="$BACKUP_DST/mysql_$NOW.tar.gz" //mysql备份文件
DATEFILE="$BACKUP_DST/date_$NOW.tar.gz"    //数据备份文件
 
# backup files
tar czvf $DATEFILE $BACKUP_SRC
 
# backup mysql db
mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS radius > "$NOW-Databases.sql"
tar cfz "$MYSQLTFILE" "$NOW-Databases.sql"
 
# upload to Dropbox
sh /root/dropbox_uploader.sh -u $DROPBOX_USER -p $DROPBOX_PASS -f $MYSQLTFILE -d /Attachments
 
# delete the files
rm -rf $NOW-Databases.sql

文件二:Dropbox Uploader Script v0.7.1

#!/bin/bash
#
# Dropbox Uploader Script v0.7.1
#
# Copyright (C) 2010-2011 Andrea Fabrizi <andrea.fabrizi@gmail.com>
#  
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#  
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#  
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
 
#DROPBOX ACCOUNT
#For security reasons, it is not recommended to modify this script
#to hardcode a login and password.  However, this can be done if 
#automation is necessary.
LOGIN_EMAIL=""
LOGIN_PASSWD=""
 
#Set to 1 to enable DEBUG mode
DEBUG=0
 
#Set to 1 to enable VERBOSE mode (-v option)
VERBOSE=0
 
#If set to 1 the script terminate if an upload error occurs
END_ON_UPLOAD_ERROR=0
 
#Set to 1 to skip the initial login page loading (Speed up the uploading process).
#Set to 0 if you experience problems uploading the files.
SKIP_LOADING_LOGIN_PAGE=1
 
#Don't edit these...
LOGIN_URL="https://www.dropbox.com/login"
HOME_URL="https://www.dropbox.com/home"
UPLOAD_URL="https://dl-web.dropbox.com/upload"
COOKIE_FILE="/tmp/du_cookie_$RANDOM"
RESPONSE_FILE="/tmp/du_resp_$RANDOM"
BIN_DEPS="curl sed grep tr pwd"
VERSION="0.7.1"
 
if [ $DEBUG -ne 0 ]; then
    set -x
    COOKIE_FILE="/tmp/du_cookie_debug"
    RESPONSE_FILE="/tmp/du_resp_debug"
fi
 
#Print verbose information depend on $VERBOSE variable
function print
{
    if [ $VERBOSE -eq 1 ]; then
	    echo -ne "$1";
    fi
}
 
#Remove temporary files
function remove_temp_files
{
    if [ $DEBUG -eq 0 ]; then
        rm -fr $COOKIE_FILE
        rm -fr $RESPONSE_FILE
    fi
}
 
#Extract token from the specified form
# $1 = file path
# $2 = form action
function get_token
{
    TOKEN=$(cat $1 | tr -d '\n' | sed 's/.*<form action="'$2'"[^>]*>\s*<input type="hidden" name="t" value="\([a-z 0-9]*\)".*/\1/')
    echo $TOKEN      
}
 
#Upload a single file to dropbox
# $1 = local file path
# $2 = remote destination folder
function dropbox_upload
{
    UPLOAD_FILE=$1
    DEST_FOLDER=$2
 
    print " > Uploading '$UPLOAD_FILE' to 'DROPBOX$DEST_FOLDER'..."
    curl -s -i -b $COOKIE_FILE -o $RESPONSE_FILE -F "plain=yes" -F "dest=$DEST_FOLDER" -F "t=$TOKEN" -F "file=@$UPLOAD_FILE"  "$UPLOAD_URL"
    grep "HTTP/1.1 302 FOUND" "$RESPONSE_FILE" > /dev/null
 
    if [ $? -ne 0 ]; then
        print " Failed!\n"
        if [ $END_ON_UPLOAD_ERROR -eq 1 ]; then
            remove_temp_files
            exit 1
        fi
    else
        print " OK\n"
    fi
}
 
#Recursively upload a directory structure
# $1 = remote destination folder
function dropbox_upload_dir
{
    for i in *; do
 
        if [ -f "$i" ]; then
            dropbox_upload "$i" "$1"
        fi
 
        if [ -d "$i" ]; then
            local OLD_PWD=$(pwd)
            cd "$i"
            dropbox_upload_dir "$1/$i"
            cd "$OLD_PWD"
        fi        
    done
}
 
 
#Handles the keyboard interrupt (control-c)
function ctrl_c
{
    print "\n Bye ;)\n"
    remove_temp_files
    exit 1
}
 
#Trap keyboard interrupt (control-c)
trap ctrl_c SIGINT
 
#CHECK DEPENDENCIES
for i in $BIN_DEPS; do
    which $i > /dev/null
    if [ $? -ne 0 ]; then
        echo -e "Error: Required file could not be found: $i"
        remove_temp_files
        exit 1
    fi
done
 
#USAGE
function usage() {
    echo -e "Dropbox Uploader v$VERSION"
    echo -e "Usage: $0 [OPTIONS]..."
    echo -e "\nOptions:"
    echo -e "\t-u [USERNAME] (required if not hardcoded)"
    echo -e "\t-p [PASSWORD] (required if not hardcoded)"
    echo -e "\t-f [FILE/FOLDER] (required)"
    echo -e "\t-d [REMOTE_FOLDER] (default: /)"
    echo -e "\t-v Verbose mode"
 
    remove_temp_files
}
 
# File variables
UPLOAD_FILE=""
DEST_FOLDER=""
 
optn=0;
 
while getopts "u:p:f:d:v" opt; do
    case $opt in
        u)
            LOGIN_EMAIL="$OPTARG"
            let optn++;;
        p)
            LOGIN_PASSWD="$OPTARG"
            let optn++;;
        f)
            UPLOAD_FILE="$OPTARG"
            let optn++;;
        d)
            DEST_FOLDER="$OPTARG"
            let optn++;;
        v)	
            VERBOSE=1;;
        *)	
            usage;
            exit 0;
    esac
done
 
if [ $optn -lt 1 ] || [ "$LOGIN_EMAIL" == "" ] || [ "$LOGIN_PASSWD" == "" ]; then
	usage;
	exit 1;
fi
 
if [ "$DEST_FOLDER" == "" ]; then
    DEST_FOLDER="/"
fi
 
print "Dropbox Uploader v$VERSION\n"
 
#CHECK FILE/DIR
if [ ! -r "$UPLOAD_FILE" ]; then
    echo -e "Error reading '$1'"
    remove_temp_files
    exit 1
fi
 
#LOAD LOGIN PAGE
if [ $SKIP_LOADING_LOGIN_PAGE -eq 0 ]; then
    print " > Loading Login Page..."
    curl -s -i -o "$RESPONSE_FILE" "$LOGIN_URL"
 
    if [ $? -ne 0 ]; then
        print " Failed!\n"
        remove_temp_files
        exit 1
    else
        print " OK\n"
    fi
 
    #GET TOKEN
    TOKEN=$(get_token "$RESPONSE_FILE" "\/login")
    #echo -e " > Token = $TOKEN"
    if [ "$TOKEN" == "" ]; then
        print " Failed to get Authentication token!\n"
        remove_temp_files
        exit 1
    fi
fi
 
#LOGIN
print " > Logging in..."
curl -s -i -c $COOKIE_FILE -o $RESPONSE_FILE --data "login_email=$LOGIN_EMAIL&login_password=$LOGIN_PASSWD&t=$TOKEN" "$LOGIN_URL"
grep "location: /home" $RESPONSE_FILE > /dev/null
 
if [ $? -ne 0 ]; then
    print " Failed!\n"
    remove_temp_files
    exit 1
else
    print " OK\n"
fi
 
#LOAD HOME
print " > Loading Home..."
curl -s -i -b "$COOKIE_FILE" -o "$RESPONSE_FILE" "$HOME_URL"
 
if [ $? -ne 0 ]; then
    print " Failed!\n"
    remove_temp_files
    exit 1
else
    print " OK\n"
fi
 
#GET TOKEN
TOKEN=$(get_token "$RESPONSE_FILE" "https:\/\/dl-web.dropbox.com\/upload")
#echo -e " > Token = $TOKEN"
if [ "$TOKEN" == "" ]; then
    print " Failed to get Upload token!\n"
    remove_temp_files
    exit 1
fi
 
#If it's a single file...
if [ -f "$UPLOAD_FILE" ]; then
    dropbox_upload "$UPLOAD_FILE" "$DEST_FOLDER"
fi
 
#If it's a directory...
if [ -d "$UPLOAD_FILE" ]; then
    OLD_PWD=$(pwd)
    cd "$UPLOAD_FILE"
    dropbox_upload_dir "$DEST_FOLDER"
    cd "$OLD_PWD"
fi
 
 
remove_temp_files
  1. 路人甲
    2011年10月29日21:48

    大师,这个可以不可以不那么精简,毕竟小白还是挺多的。。
    能说下详细使用方法么。。

    第一个脚本是打包备份文件的,第二个是上传的,可怎么运作呢,添加到任务里?

    ChromePlus 1.6.3.1 Windows 7
  2. 2012年3月11日20:49

    @路人甲 认同意见,太精简了。

    Maxthon 3.0 Windows XP
  3. 2012年3月11日20:52

    @路人甲
    对,添加到计划任务就可以了。

    Firefox 10.0.2 Windows Server 2003

返回顶部