wget ftp连接在PASV命令后失败

在尝试将所有文​​件从一个Web服务器(“源”)传输到另一个(“目的地”)时,wget命令通过FTP进行连接,但无法继续执行PASV命令。

我使用SSH连接到“目标”服务器(共享主机上的一个Linux机器)来运行wget命令。

“源”服务器是Microsoft服务器,而我的桌面上的FTP客户端没有问题。

以下是我用来启动传输的命令:

wget -m ftp://username:'password'@sourceserver.com 

login成功,然后发出这些命令:

 ==> SYST ... done. ==> PWD ... done. ==> TYPE I ... done. ==> CWD not needed. ==> ... couldn't connect to xxx.xxx.xxx.xxx port 1128: Connection timed out Retrying. 

由于“无法连接”错误,在每次重试时,它会尝试一个不同的端口号(不是21,它已经成功连接)。 我第一次记下这个错误,它尝试了487X范围内的端口。

我不能确定问题是在Microsoft(“源”)服务器端还是在Linux(“客户端”)端。

思考?

对于文件传输或目录列表,FTP会在dynamic端口上打开其他TCP连接。 在主动模式下,客户端创build一个本地监听器,让服务器使用PORT命令知道其IP:Port,然后服务器连接到客户端端口(通常从服务器端的端口20)。 在被动模式下,服务器打开端口,让客户端知道它在哪里侦听以响应客户端PASV命令。

两种模式都需要

  • 另一端可以访问的IP,例如在简单的NAT路由器后面有客户端的主动模式将不起作用
  • 没有一个或者一个宽敞的防火墙,因为监听端的端口对于每个连接都是不同的。

如果您从桌面客户端没有任何问题,则可能是桌面客户端正在使用主动模式,而wget使用被动模式,或者桌面和服务器之间没有防火墙/ NAT路由器,但在你的共享主机和服务器之间有一个。

没有获得更多关于你的设置的细节很难推测更多。

对于VSFTPD,您可以指定被动端口范围

 pasv_min_port=1024 pasv_max_port=1048 

学分: 在Amazon Cloud Server上设置FTP

另外,我看到wget 失败了 ,但是当curl 成功

 pasv_address 

与请求的IP不匹配 – 例如请求使用外部networkingIP,但是pasv_address是内部networkingIP。

不知道为什么会发生这种情况,但必须在wget和curl之间的底层实现方面有所不同。

另一种方法是避免被动模式,在你的wget命令中join–no-passive参数可以做到这一点。

 wget -r --no-passive --no-parent ftp://account:Ftit654321@45.63.122.249/infinit_request/ -P /root