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

Jos*_*osh 4 linux ftp bash tar

我在本地服务器上备份 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
Run Code Online (Sandbox Code Playgroud)

Spi*_*iff 11

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

例如,如果本地服务器是 Windows(使用 CRLF 作为行尾)而远程服务器是 Unix(仅使用 LF 作为行尾),并且您没有指定二进制模式并且您的 FTP 软件不会自动 -检测它并做正确的事情,然后您将使用 ASCII 模式进行传输,这应该从任何 CRLF 对中去除 CR。如果你的 gzip 压缩包碰巧在任何地方出现了字节模式 0x0d0a,它就会丢失 0x0d。

如果您的发送系统(我猜那是您的本地服务器)上的命令行 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  
Run Code Online (Sandbox Code Playgroud)

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