我将 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。