正如大家所知,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进行测试。因此,难免有疏漏,敬请高手飘过不吝赐教!
这样是不是只能备份一个站点?如果要备份多个数据库,是如何操作?
本脚本仅备份指定的一个数据库,即变量$MySQL_DATABASE,如需备份全部数据库,可将脚本中的$MySQL_DATABASE,替换成–all-databases。这样可以备份MySQL下所有的数据库为一个.sql文件,但是这样有个坏处,把没用的数据库也一起备份了。我昨天尝试了其他脚本的分别打包,但是在Debian下总是报错,就放弃了…等我有时间再研究一下吧~
大叔- -我如果写多个脚本会不会冲突?
有一个好用就行了呗。多个的话,如果都是简单的shell脚本的话,分开时段运行应该不会互相影响。不过也不推荐,这样意义不大吧
😀 谢谢教程,白点好,大家都能明白。
呵呵,主要是因为我自己也是小白一名~努力学习中~
这应该不是使用API,这是抓包通过curl模拟用户登录上传的动作来自动化上传。先要确定环境是否支持curl,不止dropbox,115网盘等等都可以的。
呵呵,多谢指导,我只知道Curl~就是模拟网页上传?开发一下115,对于国内VPS应该是利器~
其实网盘网赚中用VPS远程上传到网盘就是通过curl模拟登陆的,只是115不想国外的稳定,老是改版更新,数据格式上变来变去,很麻烦,我也曾经试过这样备份,可惜不久115又改了,又要抓包分析,反反复复,实用性不大。
图片很牛逼…
随便找来P的,呵呵
这个,在老外的博客里找到过,测试过几次,都失败了。说是第9行还是第十行就出错,也不知道是怎么搞的
可以再试下我这个,我运行老外的也出错,后来自己改了许多才成功的
当你的网站数据库高达G级别时 骚年 这种办法你会哭的。
这么大的数据也就不在乎专门搞个大硬盘的VPS进行备份了~
你好 请问现在dropbox 有文件上传大小限制吗 如果超出限制大小 是不是可以把数据通过分割(分卷压缩)方式上传呢 有实现的方法吗 ?
这个更高级的方法我是没再延伸过…
[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!
测试每次都是失败 ,不知道为什么·
貌似登陆成功但是无法上传….哪里的VPS?国内的VPS可能会出现这样的问题
还有就是备份数据库的时候出错了。为什么呢?
莫非是我vps不支持mysqldump 命令?
具体错误命令是mysqldump: command not found
应该是应用链接错误,用find / -name mysqldump查找,在用ln重新连接一下。具体步骤百度看看