【问题标题】:bash sh script for remote backups用于远程备份的 bash sh 脚本
【发布时间】:2018-07-11 08:22:57
【问题描述】:

我在服务器上遇到问题,有时从服务器到远程主机的自动备份失败。

目前,这让我没有最近的备份,并且一堆 .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

我的目的是制作这个脚本,我可以将它上传到有问题的服务器文件夹中,然后在文件夹中运行脚本(在chmoding 之后)以移动 .tar.gz 文件 - 一次一个- FTP 到备份目录 (/&lt;date&gt;/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

我需要对上述脚本进行哪些调整才能做到这一点?

【问题讨论】:

    标签: bash ftp


    【解决方案1】:

    经过一些工作,我发现了一些需要注意和修复的问题:

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

    chmod +x ./<filename>
    

    2) Unix 行尾;在使用 Notepad++ 时 声称 保存了正确的行尾,但错误出现在以下服务器上:

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

    解决了这个问题:

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

    来自this answer

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

    已修复

    -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//' /&lt;filepath&gt;/&lt;filename&gt;
    • 3) 运行chmod +x ./&lt;filename&gt;
    • 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
    

    【讨论】:

      猜你喜欢
      • 2014-07-04
      • 2022-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-08
      • 2014-07-23
      相关资源
      最近更新 更多