趁着还是学生入了阿里云的9.5学生服务器,配置比我90块的日本服务器还好_(:з)∠)_(赞美祖国,因为日本服务器使用了Centos7,国内这台就选择了windows server 2012。毕竟国外服务器,哪天被墙了就操蛋了,于是打算写一个shell脚本定时备份,并传给国内的windows服务器。

我的备份主要是备份我的一些站点还有seafile的文件,当然还有数据库,将他们备份到一起打包成zip再发送出去

##下面是Shell脚本:##

首先声明bash解释器,写在脚本第一行

#!/bin/bas

定义仨变量,时间当前路径备份路径

time=` date +%Y%m%d%H%M`
curdir=$(cd `dirname $0`; pwd)  #当前路径用于最后回到执行脚本前目录
backupdir=/home/backups/backups_$time

然后做一个目录是否存在的判断,不存在就创建目录

if [ ! -d "/home/backups" ]; then
  mkdir /home/backups
fi

if [ ! -d "$backupdir" ]; then
  mkdir $backupdir
fi

然后复制站点(WWW)和seaflie文件到备份目录

cp -rf /var/www $backupdir
cp -rf /home/sakuradon $backupdir

再做一次目录判断,用于存mysql数据库备份

if [ ! -d "$backupdir/mysql" ]; then
  mkdir $backupdir/mysql
fi

备份数据库数据
mysqldump的格式为:mysqldump -uroot -pPassword [database name] > [dump file],一条语句备份一个库

mysqldump -uroot -ppassword typecho > $backupdir/mysql/typecho.sql
mysqldump -uroot -ppassword ccnet-db > $backupdir/mysql/ccnet-db.sql
mysqldump -uroot -ppassword seafile-db > $backupdir/mysql/seafile-db.sql
mysqldump -uroot -ppassword seahub-db > $backupdir/mysql/seahub-db.sql

打包备份文件,删除目录,返回执行前目录

请先确认安装了zip,没有请yum install zip

cd /home/backups
zip -r backups_$time.zip backups_$time
rm -rf backups_$time
cd $curdir

接着使用expect解释器,通过scp向另一台服务器传输备份数据
使用expect可以自动输入弹出的密码框

请先确认安装了expect,没有请yum install expect

Linux → windows scp linux文件名 windows用户名@windowsIP:/盘符/目录

/usr/bin/expect<<-EOF
set timeout -1  #超时默认30s,如果备份文件过大就一定要改,-1为无限制
spawn scp $backupdir.zip administrator@127.0.0.1:/c:/backups
expect "*password*"  #弹出框的关键词
send "Password\r"
expect eof
EOF

请先手动尝试传输一下文件,例如`scp test.sh administrator@127.0.0.1:/c:/backups`,一般来说第一次连接服务器会提示你ECDSA key相关的信息,然后询问你是否继续连接之类的问题,需要手动输入yes,如果后来备份服务器未能收到文件,也可尝试手动传输一下。


##然后是windows服务器的配置##
首先得下载Bitvise SSH Server,在服务器上配置好,配置教程在这。

配置完成后防火墙需要放行对应端口(默认22),如果是阿里云等服务商,记得上控制台再放行一次端口。
因为阿里云本身自带一层防火墙,完全可以关闭windows自带的防火墙。

防火墙.png

此时可以执行以下脚本,确认一下连接等等.


##最后把Shell脚本加入cron定时执行##
检查cron是否 安装/开启

systemctl status crond

没有安装就先安装,vixie-cron是主程序,crontabs则是用来安装、卸装、或列举用来驱动 cron 守护进程的表格的程序。

yum install vixie-cron
yum install crontabs

如果没启动就先启动

systemctl start crond

使用crontab -u 用户名 -l列出当前计划
使用crontab -u 用户名 -e开始编辑计划

计划格式:* * * * * 执行的命令

cron.png

星号)可以用来代表所有有效的值。譬如,月份值中的星号意味着在满足其它制约条件后每月都执行该命令。
短线(-)指定一个整数范围。譬如,1-4 意味着整数 1、2、3、4。
逗号(,)隔开的一系列值指定一个列表。譬如,3, 4, 6, 8 标明这四个指定的整数。
正斜线(/)可以用来指定间隔频率。在范围后加上 /意味着在范围内可以跳过。譬如,0-59/2 可以用来在分钟字段定义每两分钟。间隔频率值还可以和星号一起使用。例如,
/3 的值可以用在月份字段中表示每三个月运行一次任务

创建任务0 3 * * * /root/backups.sh,即每天凌晨3:00执行一次备份脚本

##使用Onedrive储存备份##

除了将服务器的数据转移向另一台服务器进行备份,其实还可以直接存储到云盘上。云盘拥有更快的上下行,相较于自己的服务器更加的稳定。Onedrive免费版拥有5G的容量,经常清理还是足够备份了。

首先需要下载Onedrivecmd,这是一个python编写的命令行应用,可以查看、下载、上传Onedrive云盘等操作。

pip install onedrivecmd

[scode type="lblue"]建议使用python3进行安装,python2很容易出一些问题[/scode]

安装好了之后,第一次启动需要初始化登录

#个人版登录命令
onedrivecmd init

#企业/Office 365/Education登录命令
onedrivecmd init_business

然后会生成一个网址,在浏览器中打开并登录Onedrive之后会出现一串码。复制到Paste code here:后,提示Logged in, saving information...即为登录成功。

列出Onedrivecmd的操作命令,转自Onedrivecmd:OneDrive的命令行客户端,可直接上传/下载文件等

#注意根目录为od:/,后面带/为目录,不带为文件
Usage onedrivecmd:
onedrivecmd -h 
onedrivecmd [OPTIONS] init 个人版登陆
onedrivecmd [OPTIONS] init_business 企业/Office 365/Education登陆
onedrivecmd [OPTIONS] list od:/foo/bar/ 列目录
onedrivecmd [OPTIONS] share od:/foo/bar/ 共享
onedrivecmd [OPTIONS] direct od:/foo/bar/ 取直链!这个直链不过期
onedrivecmd [OPTIONS] get od:/foo/file.txt /tmp/ 下载
onedrivecmd [OPTIONS] put /tmp/hello.txt od:/bar/ 上传
onedrivecmd [OPTIONS] delete od:/foo/bar 删除
onedrivecmd [OPTIONS] mkdir od:/foo/bar/ 建目录
onedrivecmd [OPTIONS] search foobar 搜索
onedrivecmd [OPTIONS] remote http://thecatapi.com/api/images/get?format=src&type=gif 离线下载
onedrivecmd [OPTIONS] quota 看容量

[OPTIONS]
-conf="~/.onedrive.json": 配置文件,此文件和密码一样重要
-h: 帮助
-hack: 用SDK上传/aria2下载
-recursive=false: 递归列目录,速度比想象中慢得多
-chunk=62914560: 上传分片大小,必须是320K的倍数,不能超过60MB
-url=False: 只列出文件下载URL,这个URL失效很快

使用onedrivecmd list就能看到自己云盘里的所有东西啦。
然后就是改脚本了,只需要把

/usr/bin/expect<<-EOF
set timeout -1  #超时默认30s,如果备份文件过大就一定要改,-1为无限制
spawn scp $backupdir.zip administrator@127.0.0.1:/c:/backups
expect "*password*"  #弹出框的关键词
send "Password\r"
expect eof
EOF

这一块改为

onedrivecmd put $backupdir.zip od:/backups/