首页 > 解决方案 > 用于远程备份的 bash sh 脚本

问题描述

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

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

我目前纠正这种情况的过程是手动输入 Putty 并在命令行中单独通过 FTP 传输这些文件。这是耗时且乏味的。

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

我发现了这个问题,它显示了一个适用于这个问题提问者的脚本,但我需要调整这个脚本的部分内容,我不知道(我不够自信)使用 .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'd 到备份目录( /<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

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

标签: bashftp

解决方案


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

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

chmod +x ./<filename>

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

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

这解决了:

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

这个答案

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

这是固定的

-exec basename {} .tar.gz 

变成

-exec basename {}

4)日志文件输出未设置在新行上;而是都在同一条线上。这已通过阅读此 anwser-e在 echo 语句上使用并使用\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

推荐阅读