2

我有一个 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 已经为其他备份功能设置了其他东西,谢谢

第二次编辑 Ahmed rsync 在命令行测试中效果很好,它比 FTP 快得多,服务器在本地网络上,所以 SSH 没什么大不了的,但为了增加安全性很高兴,我将在我的脚本中完成实现明天,再次感谢

4

2 回答 2

4

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

您的此处文档语法也存在问题;<<和分隔符之间没有空格(在您的情况下为 EOF),我添加了 a-因为您在 ACTUAL 分隔符之前放置了空格(在 if / fi 块中添加了空格),因此需要 [-]

现在当你这样做时;您可以解析输出文件以查找文件的成功放置。例如:

  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

并在给定时间运行 schedule_cleanup.sh cron;这样在清理文件之前你会有一些余量

如果您的远程 FTP 服务器具有良好的 SITE 或 PROXY 选项,您可以在成功上传后让远程 FTP 对上传的文件运行校验和并返回结果。

SCP/RSYNC 选项

使用 FTP 既笨重又危险,您真的应该尝试看看您是否可以通过 scp 或 ssh 访问远程系统。

如果您没有使用 ssh-keygen 的 ssh 密钥,则可以生成: 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 上工作,你很开心和安全

于 2013-05-08T21:01:47.140 回答
1

尝试下一个

#!/bin/bash

runifok() { echo "will run this when the transfer is OK"; }

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 <<EOF | grep -q '226 transfer complete' && runifok
user $USER $PASS
cd /baks
lcd $WKBKDIR
put weekending-$YEAR-$MONTH-$DAY.tar.gz
bye 
EOF

fi

测试它以及何时运行正常 - 将runifok函数中的 echo 替换为上传成功后要执行的命令。

于 2013-05-08T21:00:24.000 回答