用于远程备份的bash sh脚本

时间:2018-07-11 08:22:57

标签: bash ftp

我在服务器上遇到问题,在这种情况下,从服务器到远程主机的自动备份失败。

当前,这使我没有最近的备份,也没有一堆.tar.gz文件占用了服务器上的大量空间。

我目前纠正该问题的方法是手动输入腻子,并通过命令行在各个FTP上分别传输这些文件。这既费时又乏味。

我想编写一个.sh脚本,我可以上传到该文件夹​​,并告诉服务器将文件夹中的每个.tar.gz文件放入其中。我无法传输整个文件夹,而只能传输其中的每个文件,因为某些文件已经正确传输,等等。

我发现this question 显示了一个脚本,该脚本可以解决此问题,但我需要调整此脚本的一部分,并且我不知道(不够自信)使用.sh指令来执行此操作,并且也要警惕弄乱服务器端。

#!/bin/sh
USERNAME="user"
PASSWORD="pass"
SERVER="123.456.78.90"
DATE="`date +%Y-%m-%d`"
BACKUPDIR="/${DATE}/accounts/"

find . -type f -name "*.tar.gz" -exec basename {} .tar.gz \; |
  while read filename ; do
    /bin/ftp -inv $SERVER >> /tmp/ftp_backup.log <<EOF
user $USERNAME $PASSWORD
cd $BACKUPDIR
binary
put $filename
EOF
    echo "$date copied $filename" >> /tmp/ftp_backup.log
done

我的意图是使该脚本可以上传到有问题的服务器文件夹中,然后在文件夹中运行脚本(chmod之后)以移动.tar.gz文件-一次一个-通过FTP到达备份目录(/<date>/accounts/),并在它们全部移动后完成。

(然后,我将删除服务器端的.tar.gz文件和上面的.sh脚本。)

有大约60个文件,最大大小为15Gb。文件名不包含空格。

文件路径结构:

服务端:

  

/backupsfolder/2018-07-11/filename1.tar.gz
     /backupsfolder/2018-07-11/filename2.tar.gz
     /backupsfolder/2018-07-11/backupscript.sh //我上面的脚本
     /backupsfolder/2018-07-11/master.meta //其他文件

FTP端:

  

/2018-07-11/accounts/filename1.tar.gz

我需要在上述脚本上进行哪些调整?

1 个答案:

答案 0 :(得分:0)

经过一些工作,我发现一些需要注意和解决的问题:

1)为了运行,.sh文件需要在服务器上通过chmod被“启用”。

chmod +x ./<filename>

2) Unix行尾;在使用记事本++时,它声明了以保存正确的行尾,但是该错误出现在服务器上:

  

/ bin / sh ^ M:解释器错误:没有这样的文件或目录

此问题的解决方法是:

sed -i 's/\r//'  <filepath>/<filename>

来自this answer

3)被推送到FTP的文件名称是错误的-不包括.tar.gz-我还没有意识到-exec功能会切断.tar.gz

此问题已通过

解决
-exec basename {} .tar.gz 

成为

-exec basename {}

4)未在新行上设置日志文件输出;而是全部都在同一条线上。 通过读取this anwser并在echo语句上使用-e并使用\n语法可以解决此问题。

echo -e "$date copied $filename\n" 

完全可以满足我要求的bash脚本:

  • 1)将脚本保存到服务器
  • 2)运行sed -i 's/\r//' /<filepath>/<filename>
  • 3)运行chmod +x ./<filename>
  • 4)在bash中运行文件。
  • 5)在指定的tmp目录中查看结果。

脚本

此脚本从当前目录中获取.tar.gz文件,并将它们保存到远程FTP,依次轮流浏览每个文件。

#!/bin/sh
USERNAME="user"
PASSWORD="pass"
SERVER="123.456.78.90"
DATE="`date +%Y-%m-%d`"
BACKUPDIR="/${DATE}/accounts/"

find . -type f -name "*.tar.gz" -exec basename {} \; |
  while read filename ; do 
    ftp -inv $SERVER >> /tmp/My_ftp_backup.log <<EOF
user $USERNAME $PASSWORD
cd $BACKUPDIR
binary
put $filename
EOF
    echo -e "$date copied $filename\n" >> /tmp/My_ftp_backup.log
done