我在服务器上遇到问题,在这种情况下,从服务器到远程主机的自动备份失败。
当前,这使我没有最近的备份,也没有一堆.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
答案 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脚本:
sed -i 's/\r//' /<filepath>/<filename>
chmod +x ./<filename>
此脚本从当前目录中获取.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