如何在 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 更正:“Windows ftp.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 pasvquoteliteral 是别名)。它不起作用,因为它不起作用。 My answer 解释了原因。【参考方案10】:

FileZilla 运行良好。我使用支持被动模式的 FileZilla FTP 客户端“手动传输”。

示例: 打开 FileZilla 并选择“传输”>>“手动传输”,然后在手动传输窗口中执行以下操作:

    确认选择了正确的下载/上传选项 对于远程:输入要下载的文件所在目录的名称 对于远程:输入要下载的文件的名称 对于本地:浏览到要将文件下载到的所需目录 对于本地:输入文件名以将下载的文件另存为(使用与要下载的文件相同的文件名,除非您想更改它) 勾选“立即开始传输”并点击“确定” 应立即开始下载 注意:如果您忘记勾选“立即开始传输”... 没问题:只需右键单击要下载的文件(在 FileZilla 窗口底部的 Process Queue(文件传输队列)内)窗格并选择“进程队列” 下载过程应立即开始 完成

【讨论】:

问题是关于“Windows 命令提示符”。 FileZilla 是 GUI 应用程序。 filezilla 不提供对脚本的支持......当你想自己移动东西时很好,当你想自动完成时就不太好了【参考方案11】:

这是一个常见的问题。 当我们启动 ftp 连接时,只有外部 ip 打开端口用于 pasv 连接。但是 NAT 后面的 ip 没有打开连接,所以被动连接因 PASV 命令而失败

我们需要指定在打开连接的同时打开连接

ftp -p 主机

【讨论】:

Windows ftp 客户端没有-p 开关。

以上是关于如何在 Windows 命令提示符下使用被动 FTP 模式?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Windows 命令提示符下使用 Dev C++ 编译器编译 C++ 程序?

Windows下如何使用curl命令?

如何在 Windows 命令提示符下每 5 分钟安排一次任务?

如何在 Windows 命令提示符下同时启动 2 个程序

如何在 Windows 命令提示符下拆分命令输出?

如何在 Windows 命令提示符下运行 .sh?