通过scp命令下载备份文件的shell脚本实现——使用sshpass
近期,搭建的应用系统,做了一个shell定时备份,想要从各个数据库里,将数据定时备份到另一台备份机。
mysql数据库备份在前面博客(http://blog.csdn.net/ruijiao_ren/article/details/79517086)中已做了说明,hbase和es备份,策略是每天将数据备份到本地,在备份机上定时下载。
这时,我想使用scp命令在备份机上执行命令,通过远程下载将备份文件下载到备份机上,但是发现scp命令手动执行的时候如下:
scp [email protected]:/usr/local/workspaces/hbase_back/xhs_hbase_20180313* /usr/local/backDatas/hbase
可以成功执行,在对应目录下可以获得下载的文件,但是在执行命令过程中,会提示需要手动输入对方服务器密码,来进行验证。这一步骤在手动操作时,没有问题,但是把下载命令作为shell脚本的话,这就会成为一个问题,所以我的想法是将交互式输入密码方式改为在shell脚本中直接写入,为了实现它,我查看了scp的命令,发现它并不支持在命令中直接写入密码。
所以为了解决上面的问题,需要借助其他工具,我使用了sshpass工具来解决。
1、下载这个安装包:
https://sourceforge.net/projects/sshpass/files/sshpass/1.05/sshpass-1.05.tar.gz
下载的时候需要打开此链接后,稍等一会儿,就会开始下载任务。
2、下载好后,需要上传到服务器(备份机),解压并编译安装:
进入解压目录
cd /usr/local/backDatas/sshpass/sshpass-1.05
执行编译,然后进行安装,命令如下:
./configure
make && make install
3、在命令行查看是否安装成功:
表示,安装成功。
4、 测试一下是否可以用sshpass命令成功使用密码进入其他服务器:
sshpass -p 'xxxxxxxx' ssh [email protected]
其中,'xxxxxxxx'表示需要访问的服务器的密码,172.29.xx.xx表示需要访问的服务器ip
若是可以成功进入对应服务器,则表示成功。
5、测试scp命令在语句中写入密码是否可以成功下载文件:
sshpass -p 'xxxxxxxx' scp -r [email protected]:/usr/local/workspaces/hbase_back/xhs_hbase_201803* /usr/local/backDatas/hbase
上面命令的意思就是,从172.29.xx.xx这个服务器的目录/usr/local/workspaces/hbase_back/中将xhs_hbase_201803*这个文件下载到本地(备份机)服务器的/usr/local/backDatas/hbase目录下,其中xhs_hbase_201803*这个表示与只要是xhs_hbase_201803开头的,就符合需求。若是下载的文件是个文件夹,文件夹里面还有层及目录,就需要使用 -r参数进行全部拷贝下载。测试成功后,在对应目录可以看到成功下载文件,则表示命令测试成功。
经过上面的测试,就表示可以将scp下载命令写入shell脚本,在将shell脚本设置定时执行任务。此问题解决。
shell脚本data_back.sh如下:
#!/bin/bash
#hbase's back
DATETODAY=`date +%Y%m%d`
sshpass -p 'xxxxxx' scp -r [email protected]:/usr/local/workspaces/hbase_back/xhs_hbase_${DATETODAY}* /usr/local/backDatas/hbase
#es's back
sshpass -p 'xxxxxx' scp -r [email protected]:/usr/local/workspaces/back_es/data.${DATETODAY}* /usr/local/backDatas/es
上面表示下载当天备份的数据文件到备份服务器。