在尝试将所有文件从一个 Web 服务器(“源”)传输到另一个 Web 服务器(“目标”)时,wget 命令通过 FTP 进行连接,但无法超越 PASV 命令。
我正在使用 SSH 连接到“目标”服务器(共享主机上的 Linux 机)来运行 wget 命令。
“源”服务器是 Microsoft 服务器,并且我桌面上的 FTP 客户端与其配合使用没有任何问题。
这是我用来启动传输的命令:
wget -m ftp://username:'password'@sourceserver.com
登录成功后,发出这些命令:
==> 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(“客户端”)端。
有什么想法吗?
答案1
对于文件传输或目录列表,FTP 会在动态端口上打开额外的 TCP 连接。在主动模式下,客户端会创建本地侦听器,并使用 PORT 命令让服务器知道其 IP:Port,然后服务器会连接到客户端端口(通常从服务器端的端口 20 开始)。在被动模式下,服务器会打开端口,并让客户端知道它在哪里侦听以响应客户端的 PASV 命令。
两种模式都需要
- 另一方可访问的 IP,例如,在简单 NAT 路由器后面的客户端的主动模式将不起作用
- 没有防火墙或者防火墙完全开放,因为每个连接的侦听器端的端口都是不同的。
如果您从桌面客户端访问它没有任何问题,则可能是您的桌面客户端使用主动模式,而 wget 使用被动模式,或者您的桌面和服务器之间没有防火墙/NAT 路由器,但您的共享主机和服务器之间有一个。
如果没有获得有关您的设置的更多详细信息,就很难做出更多推测。
答案2
另一种方法是避免被动模式,在 wget 命令中添加 --no-passive 参数即可。
wget -r --no-passive --no-parent ftp://account:<password>@<ip address>/folder/ -P /root
答案3
对于 VSFTPD,您可以指定被动端口范围
pasv_min_port=1024
pasv_max_port=1048
此外,我看到了 wget失败,但卷曲成功当。。。的时候
pasv_address
与请求的 IP 不匹配 - 例如请求使用的是外部网络 IP,但 pasv_address 是内部网络 IP。
不确定为什么会发生这种情况,但一定是 wget 和 curl 之间的底层实现存在差异。
答案4
我猜你的 ftp 服务器是私有 IP 并且使用 NAT 端口转发,你需要在你的 NAT 设备中启用 FTP ALG。
==> PASV ... 无法连接到192.168.1.3端口 64316:连接超时
在 NAT 设备或防火墙中启用 FTP ALG 后,私有 IP 192.168.1.3 将更改为公有 IP,因此 wget 可以与您的 ftp 服务器建立连接