为什么使用 bash ftp 将文件移动到远程服务器后我的 tar.gz 文件损坏了?

为什么使用 bash ftp 将文件移动到远程服务器后我的 tar.gz 文件损坏了?

我将 tar.gz 文件备份到本地服务器上,然后通过 ftp 将其传输到远程服务器。如果我通过 ftp 客户端从本地服务器将其拉到桌面,则文件工作正常。如果我通过 ftp 客户端从远程服务器将其拉到桌面,则文件会小几个字节并且已损坏。我尝试使用客户端强制使用 ascii 和二进制模式,但都没有损坏文件,因此我不明白为什么这会导致脚本损坏。有什么想法吗?文件传输正常,只是无法打开。提前谢谢您。

cd $FSBACKDIR
ATTACH='for file in *$DATE.tar.gz; do echo -n -e "put ${file}\n"; done'
ftp -nv <<EOF
open $FTPHOST
user $FTPUSER $FTPPASS
cd $FTPDIR
$ATTACH
quit
EOF

答案1

在我看来,尽管您使用桌面客户​​端进行了测试,但问题似乎仍然可能是 ASCII 与二进制模式的问题。您的桌面客户端可能比发送服务器(您正在运行脚本的本地服务器)上的命令行 FTP 客户端更智能。

例如,如果本地服务器是 Windows(使用 CRLF 作为行尾),而远程服务器是 Unix(仅使用 LF 作为行尾),并且您未指定二进制模式,而您的 FTP 软件不会自动检测它并执行正确的操作,那么您将使用 ASCII 模式进行传输,这应该会从任何 CRLF 对中删除 CR。如果您的 gzip 压缩包恰好在任何地方出现字节模式 0x0d0a,它将丢失 0x0d。

如果发送系统上的命令行 FTP 客户端(我猜是您的本地服务器)与我的系统上的命令行 FTP 客户端类似,那么您要测试这个理论只需 binary在该行之前或之后添加命令cd

cd $FSBACKDIR  
ATTACH='for file in *$DATE.tar.gz; do echo -n -e "put ${file}\n"; done'  
ftp -nv <<EOF  
open $FTPHOST  
user $FTPUSER $FTPPASS  
binary  
cd $FTPDIR  
$ATTACH  
quit  
EOF  

最后一个想法:如果它毕竟不是 ASCII 与二进制模式,我会查看本地和远程服务器之间(或远程服务器和桌面之间)的 NAT 网关中的 FTP ALG 是否以某种方式损坏了传输中的文件。我想它也可能是主机之间的某种其他类型的代理,而不是特定的 NAT 网关的 FTP ALG。

相关内容