检查文件是否已通过 FTP 正确传输

检查文件是否已通过 FTP 正确传输

该脚本将通过 FTP 发送文件,然后将其删除。但是,有时,文件在传输结束之前被删除,然后收到一个空文件。

#!/bin/bash

tar czf <sourcefile> --directory=<directory> log
ftp -v -n $1 <<END_OF_SESSION
user <user> <password>
put <sourcefile> <targetfile>
bye
END_OF_SESSION

rm <sourcefile>

同步进程的好方法是什么,以便在发送完成后进行删除?

如下更新所示,有时无法建立连接。

笔记:

在 Lubuntu 16.04 上运行。

随行更新tar

失败会话的日志信息:

Connected to IP
220 (vsFTPd 3.0.2)
331 Please specify the password.
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Switching to Binary mode.
local: /home/user01/tmp/log.tgz remote: E1/180418090056
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.
221 Goodbye.

以及一个成功的:

Connected to IP
220 (vsFTPd 3.0.2)
331 Please specify the password.
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
200 Switching to Binary mode.
local: /home/user01/tmp/log.tgz remote: E1/180418090344
200 PORT command successful. Consider using PASV.
150 Ok to send data.
226 Transfer complete.
6901 bytes sent in 0.00 secs (43.5848 MB/s)
221 Goodbye.

答案1

ftp命令没有功能让您检查传输是否成功。如果您必须继续使用此 FTP 传输实现,有两种选择:

  1. 将传输的文件下载到本地临时文件,并将其与源文件进行逐字节比较。
  2. 在 FTP 客户端中运行ls并检查文件长度是否符合预期。请记住,这ls取决于服务器,并且可能因服务器实现的不同而有所不同。

最好的解决方案(除了用rsync或完全替换 FTP 之外scp)是使用提供可靠传输状态的不同 FTP 客户端。

#!/bin/bash
tar czf <sourcefile> --directory=<directory> log
lftp -u '<user>,<password>' -e 'put -E <source> -o <target>; quit' "$1"

lftp命令应该在大多数 Linux 发行版中可用。该-E标志将put命令配置为更像mv而不是cp:它在成功传输后删除源文件。

相关内容