当前位置: 首页 > 知识库问答 >
问题:

被动FTP连接无法通过PHP工作

沈骞仕
2023-03-14

我的应用程序连接到通过VPN连接到服务器的FTP客户端。到目前为止,所有客户端都支持活动PHP,我使用的库默认使用活动FTP,因此没有问题。然而,现在我们安装了一些新的客户端,它们不能在活动PHP上正常工作,因此我发现从服务器(通过FTP cli和RDP上的FileZilla)可以通过被动连接连接到所有客户端并与之对话。

但是,当尝试在PHP中建立被动连接时,所有FTP命令(如nlist)都会超时。我偶然发现了这篇博客文章,它为一个特定的被动FTP问题提供了一个补丁(现在可以在常规PHP版本中使用),所以我试着像这样测试它:

$conn = ftp_connect($address);
$login = ftp_login($conn, 'username', 'password');

ftp_set_option($conn, USEPASVADDRESS, false);
ftp_pasv($conn, true);

$contents = ftp_nlist($conn, '.');

var_dump($contents);

ftp_close($conn);

ftp_pasv返回true,所以它切换到被动模式,但是ftp_nlist超时,这对于主动模式和兼容的客户端不适用。

PHPs FTP实现和FTP cli应用程序之间有什么不同?

共有1个答案

桑宇
2023-03-14

我想我已经弄清楚了我的情况到底是什么问题。我不确定这是否对其他人有帮助,但如果你有类似的问题,这可能是一个值得研究的想法。

激活被动模式时,服务器会告诉您要连接的IP和端口以进行数据传输。使用ftpCLI时,实际的PASV命令仅在发送数据命令(如请求文件夹内容)时发送。在这些情况下,CLI发送PASV命令,接收IP/端口,连接到该端口,然后通过该端口发送原始命令(LIST)。

PHP的做法似乎有所不同:只要在代码中切换到被动连接,它就会发送PASV命令,并立即从服务器接收IP/端口,但PHP尚未连接到它。然后,当我请求目录列表时,首先激活ASCII模式,然后才连接到以前接收到的IP/端口以发送LIST命令。

因此,我怀疑我连接的FTP服务器有故障。我的想法是,一旦它收到一个PASV命令,它会等待,直到有人真正连接到那个被动连接,甚至在开始接受任何其他命令之前。事实上,我设法证实了这一点。当PHP脚本还在等待响应时,我手动建立了一个到接收到的被动端口的传输控制协议,之后我的PHP代码恢复运行并向我显示结果。

不幸的是,这意味着我不能在这些服务器上使用被动FTP,更新/切换到其他服务器实现是不可能的。由于我的应用程序在Docker中运行,所以活动FTP也几乎不可能。

 类似资料:
  • 我尝试通过PHP将文件上传到运行ProFTPD的FTP服务器。这以前就像一个魅力。这是代码: 有几个有趣的PHP警告: 如果我试图通过在被动模式下改变,它也不起作用: 返回的如下: 我认为FTP服务器有问题,但其他服务器可以使用该配置。另外,我可以用FileZilla上传文件。对于PHP,活动模式也不起作用。 我的proftpd的内容。形态:

  • 如何连接到FTP通过TLS在Apache蚂蚁?ftp任务似乎不支持这一点。在TLS上的FTP还有其他任务吗?

  • 问题内容: 我有一个使用socket.IO的node.js应用程序。它可以在http上正常工作,但是当尝试通过https连接到套接字时,没有任何反应。 这是代码的一部分: 和功能: 客户端连接如下: 正如我说的,在http上一切正常,但是在https上连接会给我“连接被中断”。我究竟做错了什么? 问题答案: 您不能像服务器那样初始化服务器。您必须启动一个单独的https服务器,然后将socket.

  • 本文向大家介绍php建立Ftp连接的方法,包括了php建立Ftp连接的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php建立Ftp连接的方法。分享给大家供大家参考。具体分析如下: 今天看了下ftp函数,总结一下: FTP相关函数: ftp_connect(host,part,timeout)   建立新的ftp连接,host是要连接的服务器,part是端口,默认21,timeout

  • 问题内容: 我已经在服务器上安装了Kibana 5.4和Elastic search 5.4,我可以通过使用本地计算机上的curl来访问Kibana和Elastic search 我得到以下回应 var hashRoute =’/ app / kibana’; var defaultRoute =’/ app / kibana’; var hash = window.location.hash;

  • 我已经在服务器上安装了Kibana 5.4和Elastic search 5.4,我可以使用 我得到以下回应 var hashRoute='/app/kibana'; var defaultRoute='/app/kibana'; var hash=window.location.hash; if(hash.length){window.location=hashRoute hash;}其他{wi