使用rsync备份文件和目录的Shell脚本
时间:2020-03-05 15:31:48 来源:igfitidea点击:
本文我们引入了shell脚本,以使用rsync命令将文件和目录从本地Linux机器备份到远程Linux服务器。
这将是执行备份的一种交互方式,我们需要提供远程备份服务器的主机名/IP地址和文件夹位置。
我们在我们需要提供需要备份的文件和目录的地方保留了一个单独的文件。
我们添加了两个脚本,其中在复制每个文件后,第一个脚本询问密码(如果启用了ssh身份验证密钥,则不会询问密码),第二个脚本仅询问密码一次。
我们将备份bckup.txt,dataconfig.txt,docs和oracledb。
[root@Fedora21 tmp]# ls -l total 12 -rw-r--r--. 1 root root 0 May 15 10:43 bckrsync.sh -rw-r--r--. 1 root root 0 May 15 10:44 bckup.txt -rw-r--r--. 1 root root 0 May 15 10:46 dataconfig.txt drwxr-xr-x. 2 root root 4096 May 15 10:45 docs drwxr-xr-x. 2 root root 4096 May 15 10:44 oracledb
文件bckup.txt包含备份的文件和目录详细信息
[root@Fedora21 tmp]# cat /tmp/bckup.txt /tmp/oracledb /tmp/dataconfig.txt /tmp/docs [root@Fedora21 tmp]#
脚本1:
#!/bin/bash #We will save path to backup file in variable backupf='/tmp/bckup.txt' #Next line just prints message echo "Shell Script Backup Your Files/Directories Using rsync" #next line check if entered value is not null, and if null it will reask user to enter Destination Server while [ x$desthost = "x" ]; do #next line prints what userd should enter, and stores entered value to variable with name desthost read -p "Destination backup Server : " desthost #next line finishes while loop done #next line check if entered value is not null, and if null it will reask user to enter Destination Path while [ x$destpath = "x" ]; do #next line prints what userd should enter, and stores entered value to variable with name destpath read -p "Destination Folder : " destpath #next line finishes while loop done #Next line will start reading backup file line by line for line in `cat $backupf` #and on each line will execute next do #print message that file/dir will be copied echo "Copying $line ... " #copy via rsync file/dir to destination rsync -ar "$line" "$desthost":"$destpath" #this line just print done echo "DONE" #end of reading backup file done
使用输出运行脚本
[root@Fedora21 tmp]# ./bckrsync.sh Shell Script Backup Your Files/Directories Using rsync Destination backup Server : 104.*.*.41 Destination Folder : /tmp Copying /tmp/oracledb ... The authenticity of host '104.*.*.41 (104.*.*.41)' can't be established. ECDSA key fingerprint is 96:11:61:17:7f:fa:...... Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '104.*.*.41' (ECDSA) to the list of known hosts. root@104.*.*.41's password: DONE Copying /tmp/dataconfig.txt ... root@104.*.*.41's password: DONE Copying /tmp/docs ... root@104.*.*.41's password: DONE [root@Fedora21 tmp]#
脚本2:
#!/bin/bash #We will save path to backup file in variable backupf='/tmp/bckup.txt' #Next line just prints message echo "Shell Script Backup Your Files/Directories Using rsync" #next line check if entered value is not null, and if null it will reask user to enter Destination Server while [ x$desthost = "x" ]; do #next line prints what userd should enter, and stores entered value to variable with name desthost read -p "Destination backup Server : " desthost #next line finishes while loop done #next line check if entered value is not null, and if null it will reask user to enter Destination Path while [ x$destpath = "x" ]; do #next line prints what userd should enter, and stores entered value to variable with name destpath read -p "Destination Folder : " destpath #next line finishes while loop done #next line check if entered value is not null, and if null it will reask user to enter password while [ x$password = "x" ]; do #next line prints what userd should enter, and stores entered value to variable with name password. #To hide password we are using -s key read -sp "Password : " password #next line finishes while loop done #Next line will start reading backup file line by line for line in `cat $backupf` #and on each line will execute next do #print message that file/dir will be copied echo "Copying $line ... " #we will use expect tool to enter password inside script /usr/bin/expect << EOD #next line set timeout to -1, recommended to use set timeout -1 #copy via rsync file/dir to destination, using part of expect — spawn command spawn rsync -ar ${line} ${desthost}:${destpath} #as result of previous command we expect “password” promtp expect "*?assword:*" #next command enters password from script send "${password}\r" #next command tells that we expect end of file (everything finished on remote server) expect eof #end of expect pard EOD #this line just print done echo "DONE" #end of reading backup file done