基于网上代码修改。由于手上没有好用的FTP服务器,只能用sftp服务器,sourceforge的sftp服务器不仅免费,而且文件大小限制的不严格,速度也快,当然成了首选。
要在shell脚本里连接sftp服务器,必须要执行以下步骤:
1.为运行shell脚本的本地用户生成密钥对
2.将其中的公钥分发到sftp欲登录的远程服务器上
3.编写并以上面的本地用户运行shell脚本
一、生成密钥对:
在shell脚本中使用sftp时必须用到密钥对(公钥和私钥).可使用下列方式生成(SSH 2.X版本),这里本地用户为root:
1 |
$ ssh-keygen –d |
屏幕提示:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Generating public/private dsa key pair. Enter file in which to save the key (/root/.ssh/id_dsa): # 按回车保存为: /root/.ssh/id_dsa,即当前用户root的私钥 Enter passphrase (empty for no passphrase): # 按回车,表示读取密钥时不需要密钥的密码 Enter same passphrase again: # 确认密钥的密码,必须和上面的输入相同 Your identification has been saved in /root/.ssh/id_dsa. # 私钥保存信息 Your public key has been saved in /root/.ssh/id_dsa.pub. # 公钥保存信息 The key fingerprint is: ec:41:e8:08:38:0b:f8:1e:bc:92:98:32:fc:d7:69:7d ... # 密钥指纹 |
二.分发公钥
执行:
1 |
cat /root/.ssh/id_dsa.pub |
复制公钥,然后登录你的sf帐号,切换到 “sourceforge.net/account/ssh”, 在 “Host Access Information ” 处点击 [Edit SSH Keys for Shell/CVS], 把 上述复制的字符粘贴进去。点击 update 即可。(这个选项在services的Edit SSH Keys for Shell/CVS下)
注:如果是两个KEY或者多个的话,要确保KEY与KEY之间有且只有一个回车,KEY中间不能有空格.
这是sourceforge的用法,若远程服务器为另一台VPS,那么应该按下面的方法做:
为了使用密钥,必须将公钥分发到欲登录的远程服务器上,这里远程服务器记为remote_host,欲登录的远程用户记为remote_user
1.copy公钥到欲登录的远程服务器的远程用户的家目录下,例如: copy id_dsa.pub到remote_host:/home/remote_user/.ssh/ 若目录/home/remote_user/.ssh/不存在,请先创建之. 2.将copy来的公钥文件改名为authorized_keys 3.修改公钥文件的访问权限 chmod 644 authorized_keys |
三、脚本编写
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
#!/bin/bash #你要修改的地方从这里开始 MAIL_FROM=xx@xx.com #发信邮箱 MAIL_TO=tt@tt.com #数据库发送到的邮箱 FTP_IP=username,projectname@web.sourceforge.net #ftp地址,此处为sourceforge格式,若使用另一台vps作为备份服务器,直接用 username@remote_host即可。 FTP_backup=backup #ftp上存放备份文件的目录,这个要自己得ftp上面建的 WEB_DATA=/home/wwwroot #要备份的网站数据 MYSQL_DATA=/usr/local/mysql/var #数据库源文件路径 #定义数据库的名字和旧数据库的名字 DataBakName=Data_$(date +"%Y%m%d").tar.gz WebBakName=Web_$(date +%Y%m%d).tar.gz OldData=Data_$(date -d -5day +"%Y%m%d").tar.gz OldWeb=Web_$(date -d -5day +"%Y%m%d").tar.gz #你要修改的地方从这里结束 #删除本地3天前的数据 rm -rf /home/backup/Data_$(date -d -3day +"%Y%m%d").tar.gz /home/backup/Web_$(date -d -3day +"%Y%m%d").tar.gz cd /home/backup #压缩数据库源文件 tar zcvf /home/backup/$DataBakName $MYSQL_DATA #压缩网站数据 tar zcvf /home/backup/$WebBakName $WEB_DATA #上传到SFTP空间,删除SFTP空间5天前的数据 sftp $FTP_IP < < EOF cd $FTP_backup rm $OldData $OldWeb -put $DataBakName -put $WebBakName quit EOF #发送数据库到Email,若不发送,下面代码可以删除. echo "From:admin<$MAIL_FROM>" >>report.txt echo "To: $MAIL_TO" >>report.txt echo "Subject: 数据库备份完成" >>report.txt echo "数据备份完成,以发送到指定服务器,以下是详细信息:" >>report.txt du -m * >>report.txt date >>report.txt sendmail -t $MAIL_TO <report .txt rm report.txt |
本文参考了一下文章:
在shell脚本里使用sftp批量传送文件:http://bbs.chinaunix.net/thread-508290-1-1.html
使用putty连接sourceforge:http://www.annhe.net/article-984.html
sendmail使用方法:http://3414033.blog.51cto.com/3404033/737481
上面脚本漏了一些东西,备份前应先停止mysql服务。每天全站打包没有必要,可以删去
给脚本添加执行权限:
chmod +x /root/AutoBackupToFtp.sh
利用系统crontab实现每天自动运行:
crontab -e
输入以下内容:
00 00 * * * /root/AutoBackupToFtp.sh
其中00 00为时间分/小时,可自行修改,例如:30 12 ***,就是每天12.30运行这个脚本。
附一个使用lftp备份文件