强制lftp打开二进制连接?

Posted

技术标签:

【中文标题】强制lftp打开二进制连接?【英文标题】:Force lftp to open binary connections? 【发布时间】:2016-08-08 13:31:39 【问题描述】:

问题:我正在尝试创建公共 FTP 站点的本地镜像。当我使用lftp 完成这项工作时,它会毫无问题地创建一个镜像,但是当我几天后尝试更新镜像时,由于卡在几个文件上,它变得非常慢。

运行lftp -d 我可以看到lftpRETR 文件发出了几个请求,但是这些请求导致了几个**** Timeout - reconnecting 消息,大约2-3 分钟后我看到了

在最后一条命令之后,文件成功下载,lftp 继续进行。

从手册中我了解到 BINARY 是 lftp 的默认模式,但不知何故,它似​​乎不适用于早期请求。有人可以建议我如何强制 lftp 始终打开 BINARY 模式数据连接以下载所有文件吗?

这是一个 MWE:

``lftp -d -u anonymous,anonymous -c "open url; get file"``

以及来自lftp -d的回复:

---- Connecting to url (IP) port 21
<--- 220 (vsFTPd 3.0.3)                          
---> FEAT
<--- 211-Features:                                     
<---  EPRT
<---  EPSV
<---  MDTM
<---  PASV
<---  REST STREAM
<---  SIZE
<---  TVFS
<--- 211 End
---> USER anonymous
<--- 331 Please specify the password.            
---> PASS anonymous
<--- 230 Login successful.                                      
---> TYPE I
<--- 200 Switching to Binary mode.                         
---> SIZE file
<--- 213 3321                                              
---> MDTM file
--- 213 20160318190446                                         
---> PASV
<--- 227 Entering Passive Mode (IP).        
---- Connecting data socket to (IP) port 55380
---- Data connection established                                  
---> RETR file
**** Timeout - reconnecting                                     
---- Closing data socket
---- Closing control socket

【问题讨论】:

【参考方案1】:

lftp 默认对所有文件传输使用二进制模式,对目录列表使用 ascii 模式。所以二进制模式在这里应该没有问题。

也许您有一个微妙的连接问题,有时将 net:socket-maxseg 设置为较低的值(例如 500)会有所帮助。

【讨论】:

我没有尝试您建议的设置,因为使用--ignore-time 解决了我的问题。我接受了您的回答,因为您已经明确表示始终使用二进制模式。【参考方案2】:

二进制模式的 ftp 命令是 bin,所以在 get 文件之前使用该命令。

cd /direc/tory; bin; get file.xml

问题是我看到了

---> TYPE I
<--- 200 Switching to Binary mode.                         

在您的输出中,因此您已经处于二进制模式。我想知道你是否有不同的问题?我还看到您使用的是被动模式 (PASV),这很好,因为被动可以绕过防火墙和 NAT [1],所以我们需要另一个原因来说明为什么您会看到这些超时。

您还有其他线索吗,可能来自pingnetstat

【讨论】:

我开始怀疑我被服务器限制了……原因是打开 ftp 服务器上的任何文件(例如通过 lynx)变得非常缓慢。 但是,奇怪的是,如果我取消并重新启动 lftp,它会从第一个文件夹开始并重新下载它已经从取消的会话中更新的文件(没有任何错误或延迟)......所以我不太确定该怎么做。

以上是关于强制lftp打开二进制连接?的主要内容,如果未能解决你的问题,请参考以下文章

shell使用lftp连接ftp和sftp,并可以指定私钥

php + mysql 取得数据库中二进制文件,生成链接供打开

WebSocketReceiveResult 强制接收二进制

二进制分组——强制在线的有力算法

将二进制作为字符串返回,而不是转换或强制转换

matlab强制转换uint16转int16