如何在 Windows 命令提示符下使用被动 FTP 模式?
Posted
技术标签:
【中文标题】如何在 Windows 命令提示符下使用被动 FTP 模式?【英文标题】:How to use passive FTP mode in Windows command prompt? 【发布时间】:2013-09-09 17:07:52 【问题描述】:在 Ubuntu ftp -p
中,被动模式可以正常工作。
如何在 Windows 中执行相同操作?
我尝试使用quote pasv
,但出现以下错误:
230 OK. Current restricted directory is /
ftp> quote pasv
227 Entering Passive Mode (31,170,167,221,116,239)
ftp> cd os
250 OK. Current directory is /os
ftp> dir
500 I won't open a connection to 10.23.16.248 (only to 113.193.128.177)
425 No data connection
ftp>
我的防火墙已禁用。
【问题讨论】:
【参考方案1】:Windows FTP 命令行客户端 (ftp.exe
) 在任何版本的 Windows 上都不支持被动模式。由于无处不在的防火墙和 NAT,它现在变得非常无用。
使用quote pasv
无济于事。它只将服务器切换到被动模式,而不客户端。
请改用任何第三方 Windows FTP 命令行客户端。其他大多数都支持被动模式。
例如WinSCP 默认为被动模式,并且有一个可用于转换Windows FTP script to WinSCP script 的指南。如果您是从头开始,请参阅automating file transfers to FTP using WinSCP 的指南。另外,WinSCP GUI 可以为你generate a script template。
(我是 WinSCP 的作者)
【讨论】:
【参考方案2】:Windows 实际上并不支持被动模式。
您可以通过三种不同的方式将命令发送到服务器,但这不会在 Windows 客户端上启用被动模式。
这些参数用于发送各种命令,pasv
并不是微软在编写它时想到的。
您必须找到支持命令行使用的 WinSCP 等第 3 方软件,并使用它来代替 Windows 原生软件。
【讨论】:
我认为 pasv 在 Windows 7 中支持。 我测试过 XP, 7, 2k8, 2k12 更正:“Windowsftp.exe
不支持被动模式。”只要您使用功能齐全的 FTP 客户端,操作系统就可以很好地支持它。
pasv 不支持,包括 8.1 pro。不,不支持。试试 WinSCP(免费、开源、可编写脚本、有效)。【参考方案3】:
虽然这并没有直接回答关于命令行的问题,但在 Windows 操作系统中,使用 Windows 资源管理器ftp://username@server
这将默认使用被动模式
对于命令行,活动模式是默认的
【讨论】:
似乎并非如此,至少在所有情况下都是这样。在“DIR”命令期间尝试从资源管理器连接时,我收到相同的“拒绝与外部地址的数据连接”错误。将完整的 URL 放入文件名可以让下载通过。 好主意,但您可能仍会因特定操作(即 get/put)而受阻【参考方案4】:quote PASV
命令不是对ftp.exe
程序的命令,它是对请求高阶端口进行数据传输的 FTP 服务器的命令。被动传输是一种通过这些高位端口传输 FTP 数据,同时在低位端口保持控制的传输。
windowsftp.exe
程序可用于发送FTP服务器命令,在两台FTP服务器之间进行被动数据传输。标准的 Windows 安装不会也可能不应该将 FTP 服务器服务作为被动传输的端点运行。因此,如果需要使用标准 Windows 框进行被动传输,则需要 ftp.exe
以外的解决方案,因为 FTP 到 localhost,因为其中一个连接在大多数 Windows 环境中不起作用。
您可以在两个不同的主机(但不是同一主机上的两个连接)之间实现被动 FTP 传输,如下所示:
打开两个提示,使用一个 ftp.exe
连接到您的源 FTP 服务器,一个使用 ftp.exe
连接到您的目标 FTP 服务器。
现在使用原始命令 PASV 和 PORT 在服务器之间建立被动连接。 quote PASV
命令将以省略号表示的 IP/端口进行响应。将该数据用于quote PORT <data>
命令。假设防火墙没有阻止四个端口中的一个或多个(2 个用于 FTP 控制,2 个用于 FTP 数据),您的被动链接现已建立
接下来使用quote STOR <filename>
命令开始接收数据到接收FTP服务器,然后发送控制命令quote RETR <filename>
到源FTP服务器。
对我来说:
client 1
> ftp.exe server1
ftp> quote PASV
227 Entering Passive Mode (10,0,3,1,54,161)
client 2
> ftp.exe server2
ftp> quote PORT 10,0,3,1,54,54,161
ftp> quote STOR myFile
client 1
ftp> quote RETR myFile
警告:我正在连接一些旧的 FTP 服务器 YMMV
【讨论】:
对原发帖者会话回复的注释:227 Entering Passive Mode (31,170,167,221,116,239)
翻译:在服务器 31.170.167.221 上打开一个数据端口 :(116*256+239)500 I won't open a connection to 10.23.16.248 (only to 113.193.128.177)
这些 IP 地址不正确。发生的事情是 FTP.EXE 程序不知道如何从高阶端口(从您的 dir 命令)接收数据,并且它使用两个伪造的 IP 地址给出了这个误导性消息。【参考方案5】:
CURL 客户端支持 FTP 协议,适用于被动模式。获取 Download WITHOUT SSL 版本,您不需要任何 openssl.dll 库。只需一个 curl.exe 命令行应用程序。http://www.paehl.com/open_source/?CURL_7.35.0 http://www.paehl.com/?CURL_7.79.1
curl.exe -T c:\test\myfile.dat ftp://ftp.server.com/some/folder/myfile.dat --user myuser:mypwd
另一个是Putty psftp.exe,但是服务器密钥验证提示需要一个技巧。此命令行输入 NO 表示提示,这意味着键未存储在注册表中,只是此时正在使用。您需要一个外部脚本文件,但有时上下复制多个文件会很好。http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html
echo n | psftp.exe ftp.server.com -l myuser -pw mypwd -b script.txt
script.txt(可以输入任何 ftp 命令)
put "C:\test\myfile.dat" "/some/folder/myfile.dat"
quit
【讨论】:
psftp
是 SFTP 客户端,而不是 FTP 客户端。此外,建议自动接受 SSH 主机密钥是一个可怕的安全风险。【参考方案6】:
如果您使用的是 Windows 10,请安装适用于 Linux、WSL 和 Ubuntu 的 Windows 子系统。
$ ftp 192.168.1.39
Connected to 192.168.1.39.
............
230 Logged in successfully
Remote system type is MSDOS.
ftp> passive
Passive mode on.
ftp> passive
Passive mode off.
ftp>
【讨论】:
没错,但大概 OP 对使用ftp.exe
的解决方案感兴趣,而不是其他客户端。【参考方案7】:
根据Egnyte article,从 Windows 8.1 开始支持被动 FTP。
注册表项:
"HKEY_CURRENT_USER\Software\Microsoft\FTP\Use PASV"
应设置为值:yes
如果您不喜欢在注册表中四处寻找,请执行以下操作:
-
按 WinKey+R 打开“运行”对话框。
键入
inetcpl.cpl
并按Enter。 Internet 选项对话框将打开。
单击“高级”选项卡。
进入树视图的浏览部分,并确保将使用被动 FTP 项设置为开启。
点击确定按钮。
每次使用ftp.exe
,记得传递
quote pasv
登录到远程主机后立即执行命令。
PS:如果您的防火墙抱怨,请授予 ftp.exe
访问专用网络的权限。
【讨论】:
Use PASV
注册表项对ftp.exe
没有影响,这是资源管理器的设置。 + quote pasv
也没有效果。 + 您的防火墙抱怨的事实只是证明了这一点。
@MartinPrikryl 啊,是 /that/ 为什么它不起作用?我也试过那个解决方案。谢谢你的解释。【参考方案8】:
不是您真正要问的,而是在标准 Windows 资源管理器(文件管理器,而不是 Internet 浏览器)的搜索栏中键入 ftp://username@ftp.yourserver.dom
会打开 ftp 服务器作为常规文件夹,您可以正常浏览和使用。
【讨论】:
【参考方案9】:对于被动模式,您需要使用命令“literal” ftp>文字PASV
【讨论】:
OP 已经尝试过quote pasv
(quote
和literal
是别名)。它不起作用,因为它不起作用。 My answer 解释了原因。【参考方案10】:
FileZilla 运行良好。我使用支持被动模式的 FileZilla FTP 客户端“手动传输”。
示例: 打开 FileZilla 并选择“传输”>>“手动传输”,然后在手动传输窗口中执行以下操作:
-
确认选择了正确的下载/上传选项
对于远程:输入要下载的文件所在目录的名称
对于远程:输入要下载的文件的名称
对于本地:浏览到要将文件下载到的所需目录
对于本地:输入文件名以将下载的文件另存为(使用与要下载的文件相同的文件名,除非您想更改它)
勾选“立即开始传输”并点击“确定”
应立即开始下载
注意:如果您忘记勾选“立即开始传输”... 没问题:只需右键单击要下载的文件(在 FileZilla 窗口底部的 Process Queue(文件传输队列)内)窗格并选择“进程队列”
下载过程应立即开始
完成
【讨论】:
问题是关于“Windows 命令提示符”。 FileZilla 是 GUI 应用程序。 filezilla 不提供对脚本的支持......当你想自己移动东西时很好,当你想自动完成时就不太好了【参考方案11】:这是一个常见的问题。 当我们启动 ftp 连接时,只有外部 ip 打开端口用于 pasv 连接。但是 NAT 后面的 ip 没有打开连接,所以被动连接因 PASV 命令而失败
我们需要指定在打开连接的同时打开连接
ftp -p 主机
【讨论】:
Windowsftp
客户端没有-p
开关。以上是关于如何在 Windows 命令提示符下使用被动 FTP 模式?的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Windows 命令提示符下使用 Dev C++ 编译器编译 C++ 程序?