我有一个 bash 脚本,可以增量(每天)和完整(星期一)创建备份。每 7 天,脚本就会合并一周的备份(完整备份和增量备份)并将它们发送到 FTP 服务器,我遇到的问题是我想在 FTP 上传完成后从备份目录中删除文件,但我不能这样做,直到我知道文件已成功上传。我需要弄清楚如何捕获“226 传输完成”,以便我可以在“IF”语句中使用它来删除备份文件。任何帮助是极大的赞赏。他也是我脚本的 FTP 部分
if [ -a "$WKBKDIR/weekending-$YEAR-$MONTH-$DAY.tar.gz" ]; then
HOST=192.168.40.30 #This is the FTP servers host or IP address.
USER=username #This is the FTP user that has access to the server.
PASS=password #This is the password for the FTP user.
ftp -inv $HOST << EOF
user $USER $PASS
cd /baks
lcd $WKBKDIR
put weekending-$YEAR-$MONTH-$DAY.tar.gz
bye
EOF
fi
我想我可以使用我需要的任何方式,FTP 已经为其他东西的另一个备份功能设置了,谢谢
第二次编辑艾哈迈德 rsync 在命令行测试中工作得很好,它比 FTP 快得多,服务器位于本地网络上,所以 SSH 没什么大不了的,但很高兴能增加安全性,我将完成实现明天在我的脚本中,再次感谢
最佳答案
FTP 选项
简单的解决方案是执行以下操作:
ftp -inv $HOST >ftp-results-$YEAR-$MONTH-$DAY.out 2>&1 <<-EOF
user $USER $PASS
cd /baks
bin
lcd $WKBKDIR
put weekending-$YEAR-$MONTH-$DAY.tar.gz
bye
EOF
您的here-document语法也存在问题; <<
之间没有空格和分隔符(在您的情况下为 EOF),我添加了 -
因为您在实际定界符之前放置了空格(它被插入到 if/fi block 中),所以 [-] 是必需的
现在当你这样做时;您可以解析输出文件以查找文件的成功放置。例如:
if grep -q '226 transfer complete' ftp-results-$YEAR-$MONTH-$DAY.out; then
echo "It seems that FTP transfer completed fine, we can schedule a delete"
echo "rm -f $PWD/weekending-$YEAR-$MONTH-$DAY.tar.gz" >> scheduled_cleanup.sh
fi
然后使用cron
运行scheduled_cleanup.sh在给定的时间;这样在文件被清理之前你会有一些余量
如果您的远程 FTP 服务器具有良好的 SITE 或 PROXY 选项,您可以让远程 FTP 在成功上传后对上传的文件运行校验和并返回结果。
SCP/RSYNC 选项
使用 FTP 既笨重又危险,您应该尝试看看是否可以通过 scp 或 ssh 访问远程系统。
如果您没有 ssh key ,则可以使用 ssh-keygen 生成 ssh key :
ssh-keygen -N "" -t rsa -f ftp-rsa
将 ftp-rsa.pub 文件放入 $HOST/home/$USER/.ssh/authorized_keys 中,您将获得更好的上传文件方法:
if scp -B -C weekending-$YEAR-$MONTH-$DAY.tar.gz $USER@$HOST:/baks/ ; then
echo Upload successful 1>&2
else
echo Upload failed 1>&2
fi
或者更好的是使用 rsync:
if rsync --progress -a weekending-$YEAR-$MONTH-$DAY.tar.gz $HOST:/baks/ ; then
echo Upload successful 1>&2
else
echo Upload failed 1>&2
fi
瞧,您已经完成了,因为 rsync 通过 ssh 工作,您感到高兴且安全
关于Linux FTP put成功输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16449695/