bash - 用于远程备份的 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
我的目的是制作这个脚本,我可以将它上传到有问题的服务器文件夹中,然后在文件夹中运行脚本(在chmod
ing 之后)以移动 .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
我需要对上述脚本进行什么调整才能做到这一点?
解决方案
经过一些工作,我发现了一些需要注意和修复的问题:
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
推荐阅读
- python - 如何在 Python 中进行组合和随机样本
- jenkins - 如何在条件步骤中使用声明的变量?
- c# - 如何从单独的游戏对象位置控制着色器中的属性?
- wcf - 使用 SOAPUI 使用相互证书身份验证测试 WCF
- css - 在 Google Chrome 中隐藏日历图标
- mongodb - Mongoose .populate() 不会填充整个用户模型
- android - 如何在屏幕中居中进度条
- java - 如何在 docker 容器中部署 Spring 应用程序?
- android - 我可以从 android.view.View.onDraw() 中查看输入手势吗?
- django - 如何实现每页有效的访问计数器?