Linux FTP put成功输出

标签 linux bash shell ftp

我有一个 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/

相关文章:

linux - 有什么方法可以控制 Bash here 文档中的参数扩展吗?

linux - cd 命令在 bash 脚本中不起作用

linux - appassembler maven 插件未对生成的脚本设置 "execute"权限

linux - 文件描述符处于阻塞模式,但 read() 未阻塞

linux - 如何使用 Sed 仅注释掉未注释的行并保持空白/空行 100% 完好无损?

bash - 仅对包含特定字符串的文件调用 sed - 文件名中的空格问题

string - 将 UUID 转换为 String 以插入 mongodb

bash - 如何使用 'if' 语句检查退出状态

java - Eclipse 在 Linux 上的 Java 进程中不释放内存

php - Nginx 下载 php 而不是运行它