我在 Ubuntu 12.04 LTS 中设置了 FTP 服务器。
现在,当我尝试通过命令行从 Windows 7 连接到 FTP 服务器时ftp.exe
,我已成功连接,但无法获取目录列表。我收到错误
200 PORT command successful. Consider using PASV.
425 Failed to establish connection.
在passive
使用ls
.
从 FTP 客户端,检查 FTP 服务器是否支持被动模式,登录后,输入quote PASV
.
以下是打开和关闭被动模式的 vsftpd 服务器的连接示例
vsftpd
与pasv_enable=NO
:
# ftp localhost
Connected to localhost.localdomain.
220 (vsFTPd 2.3.5)
Name (localhost:john): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quote PASV
550 Permission denied.
ftp>
vsftpd
与pasv_enable=YES
:
# ftp localhost
Connected to localhost.localdomain.
220 (vsFTPd 2.3.5)
Name (localhost:john): anonymous
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quote PASV
227 Entering Passive Mode (127,0,0,1,173,104).
ftp>
您在主动模式下使用 FTP。
由于防火墙和 NAT,现在在主动模式下设置 FTP 可能很麻烦。
很可能是由于您的本地防火墙或 NAT,服务器无法连接回您的客户端以建立数据传输连接。
或者您的客户端不知道其外部 IP 地址,而是向服务器提供了一个内部地址(在PORT
命令中),服务器显然无法使用该地址。但事实并非如此,因为 vsftpd 默认拒绝与 FTP 控制连接的源地址(port_promiscuous
指令)不同的数据传输地址。
请参阅我的文章Active Mode 的网络配置。
如果可能,您应该使用被动模式,因为它通常不需要在客户端进行额外设置。这也是服务器通过“考虑使用 PASV”向您建议的内容。这PASV
是一个用于进入被动模式的 FTP 命令。
不幸的是,Windows FTP 命令行客户端 (the ftp.exe
) 根本不支持被动模式。它使它在今天变得毫无用处。
请改用任何其他第 3 方 Windows FTP 命令行客户端。大多数其他支持被动模式。
例如WinSCP FTP 客户端默认为被动模式,并且有一个指南可用于将Windows FTP 脚本转换为 WinSCP 脚本。
(我是WinSCP的作者)
实际上,您的 Windows 防火墙阻止了连接。cmd.exe
您需要从管理员输入这些命令。
netsh advfirewall firewall add rule name="FTP" dir=in action=allow program=%SystemRoot%\System32\ftp.exe enable=yes protocol=tcp
netsh advfirewall firewall add rule name="FTP" dir=in action=allow program=%SystemRoot%\System32\ftp.exe enable=yes protocol=udp
如果出现问题,您可以通过以下方式恢复:
netsh advfirewall firewall delete rule name="FTP" program=%SystemRoot%\System32\ftp.exe
您需要使用被动模式。
如果您使用的是 linux 客户端,请使用pftp
或ftp -p
.
来自man ftp
:
-p Use passive mode for data transfers. Allows use of ftp in environments where a firewall prevents connections from the outside world back to the client machine. Requires that the ftp server support the PASV command. This is the default if invoked as pftp.
对我有用的只是输入命令passive,ftp从主动模式进入被动模式。
禁用 Windows 防火墙,然后在 cmd 中再次运行 ftp 命令,它将起作用