免安装客户端,利用DropBox备份VPS上的网站数据

微魔部落,新手教程正如大家所知,DropBox是国外十分流行的网盘,但是由于一些原因,我们常常不能正常使用。但好在使用https协议我们依然可以正常的访问。虽然上传和下载有些问题,但是用DropBox这个免费空间来备份网站数据无疑是灰常给力的事情。当然,如果你是Windows主机,并且有足够的内存来运行诸如Dropbox的客户端,自然不必说,云网盘的同步功能可以说是万无一失。可大内存的Win VPS不是我等能消费起的,更何况本文将介绍另一种更加给力的方法,仅利用我们熟悉的脚本,不需安装客户端,就可轻松使用DropBox备份网站数据,再结合Crontab,定时备份也就顺理成章的实现了!

虽然微魔的教程素来以“白”为特色,但还是稍微讲一下原理吧。本文中的脚本主要还是利用了DropBox本身的API,实现简单的登录并上传功能,虽然界面并不是可视化的,但是既然能工作,我们何乐而不为呢?

开始之前,先创建本地备份文件夹,以供后文使用,命令为mkdir -p /home/backup

1.在适当位置建立如下脚本(下载该脚本),命名为dropbox.sh(本文脚本位置放置在/root下)

脚本将MySQL中指定数据库导出为.sql文件,最后与网站文件一起打包成最终的tgz文件。

#!/bin/bash
DROPBOX_USER="DropBox账号"
DROPBOX_PASS="DropBox密码"
DROPBOX_DIR="DropBox目录,如/vmvps"
BACKUP_SRC="要备份的目录,如/home/wwwroot/vmvps.com"
BACKUP_DST="本地备份目录,如/home/backup"
MYSQL_USER="root"
MYSQL_PASS="MySQL密码"
MYSQL_SERVER="127.0.0.1"
MySQL_DATABASE="要备份的目标数据库,如vmvps"

NOW=$(date +"%Y.%m.%d")
DESTFILE="$BACKUP_DST/$NOW.tgz"

# Backup files.
echo "Packing databases..."
mysqldump -u $MYSQL_USER -h $MYSQL_SERVER -p$MYSQL_PASS $MySQL_DATABASE > "$NOW-Databases.sql"

echo "Packing files..."
tar czf "$DESTFILE" $BACKUP_SRC "$NOW-Databases.sql"
# Upload a file to Dropbox.
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"

# Login
echo -ne " > Logging in..."
curl -s -i -c $COOKIE_FILE -o $RESPONSE_FILE --data "login_email=$DROPBOX_USER&login_password=$DROPBOX_PASS&t=$TOKEN" "$LOGIN_URL"
grep "location: /home" $RESPONSE_FILE > /dev/null
if [ $? -ne 0 ]; then
echo -e " Failed!"
rm -f "$COOKIE_FILE" "$RESPONSE_FILE"
exit 1
else
echo -e " OK"
fi

# Load home page
echo -ne " > Loading Home..."
curl -s -i -b "$COOKIE_FILE" -o "$RESPONSE_FILE" "$HOME_URL"
if [ $? -ne 0 ]; then
echo -e " Failed!"
rm -f "$COOKIE_FILE" "$RESPONSE_FILE"
exit 1
else
echo -e " OK"
fi

# Get token
TOKEN=$(cat "$RESPONSE_FILE" | tr -d '\n' | sed 's/.*<form action="https:\/\/dl-web.dropbox.com\/upload"[^>]*>\s*<input type="hidden" name="t" value="\([a-z 0-9]*\)".*/\1/')
# Upload file
echo -ne " > Uploading '$DESTFILE' to 'DROPBOX$DROPBOX_DIR/'..."
curl -s -i -b $COOKIE_FILE -o $RESPONSE_FILE -F "plain=yes" -F "dest=$DROPBOX_DIR" -F "t=$TOKEN" -F "file=@$DESTFILE" "$UPLOAD_URL"
grep "HTTP/1.1 302 FOUND" "$RESPONSE_FILE" > /dev/null

if [ $? -ne 0 ]; then
echo -e " Failed!"
rm -f "$COOKIE_FILE" "$RESPONSE_FILE"
exit 1
else
echo -e " OK"
rm -f "$COOKIE_FILE" "$RESPONSE_FILE"
fi

echo "Cleaning the backups..."
rm -f "$NOW-Databases.sql"
find $BACKUP_DST -mtime +3 -delete

本脚本仅备份指定的一个数据库,即变量$MySQL_DATABASE,如需备份全部数据库,可将脚本中的$MySQL_DATABASE,替换成–all-databases

2.赋予脚本运行权限

chmod +x dropbox.sh

3.测试脚本运行情况

/bin/bash dropbox.sh

4.如运行无误,设置定时任务

crontab -e

按照自己的需要输入,如需要每日备份可参考

00 00 * * * /bin/bash /root/dropbox.sh

根据微魔追踪,本文所用脚本,目前所知最早作者为一名老外(点击查看),后经国人部分转载与修改,微魔经过一些自己的修改形成本文,但由于测试时间有限,仅在自己的两个Debian 6系统的VPS进行测试。因此,难免有疏漏,敬请高手飘过不吝赐教!


关注微魔公众号(猛击这里),妈妈再也不用担心你抢不到传家宝了!

微魔部落提示您:请注意不定时备份数据,预防不可控因素造成的数据丢失。

关于 微魔

小微魔,大智慧!
此条目发表在 VPS教程 分类目录,贴了 , , , , , , 标签。将固定链接加入收藏夹。

免安装客户端,利用DropBox备份VPS上的网站数据》有 22 条评论

  1. 小艾 说:

    这样是不是只能备份一个站点?如果要备份多个数据库,是如何操作?

    • 微魔 说:

      本脚本仅备份指定的一个数据库,即变量$MySQL_DATABASE,如需备份全部数据库,可将脚本中的$MySQL_DATABASE,替换成–all-databases。这样可以备份MySQL下所有的数据库为一个.sql文件,但是这样有个坏处,把没用的数据库也一起备份了。我昨天尝试了其他脚本的分别打包,但是在Debian下总是报错,就放弃了…等我有时间再研究一下吧~

  2. 阿福 说:

    大叔- -我如果写多个脚本会不会冲突?

    • 微魔 说:

      有一个好用就行了呗。多个的话,如果都是简单的shell脚本的话,分开时段运行应该不会互相影响。不过也不推荐,这样意义不大吧

  3. hzqim 说:

    😀 谢谢教程,白点好,大家都能明白。

  4. neverno 说:

    这应该不是使用API,这是抓包通过curl模拟用户登录上传的动作来自动化上传。先要确定环境是否支持curl,不止dropbox,115网盘等等都可以的。

    • 微魔 说:

      呵呵,多谢指导,我只知道Curl~就是模拟网页上传?开发一下115,对于国内VPS应该是利器~

      • neverno 说:

        其实网盘网赚中用VPS远程上传到网盘就是通过curl模拟登陆的,只是115不想国外的稳定,老是改版更新,数据格式上变来变去,很麻烦,我也曾经试过这样备份,可惜不久115又改了,又要抓包分析,反反复复,实用性不大。

  5. zvv 说:

    图片很牛逼…

  6. VN. 说:

    这个,在老外的博客里找到过,测试过几次,都失败了。说是第9行还是第十行就出错,也不知道是怎么搞的

  7. andy 说:

    当你的网站数据库高达G级别时 骚年 这种办法你会哭的。

  8. 米多多 说:

    你好 请问现在dropbox 有文件上传大小限制吗 如果超出限制大小 是不是可以把数据通过分割(分卷压缩)方式上传呢 有实现的方法吗 ?

  9. 叶子 说:

    [root@Ming ~]# /bin/bash dropbox.sh
    Packing databases…
    Packing files…
    tar: Removing leading `/’ from member names
    > Logging in… OK
    > Loading Home… OK
    > Uploading ‘/home/backup/2012.09.21.tgz’ to ‘DROPBOX/backup/’… Failed!

    测试每次都是失败 ,不知道为什么·

  10. 小五 说:

    还有就是备份数据库的时候出错了。为什么呢?

    莫非是我vps不支持mysqldump 命令?

发表评论

电子邮件地址不会被公开。 必填项已用*标注