php - 奇怪的 PHP 的 FTP 包装器行为
问题描述
在远程 FTP 文件上使用fopen
会导致
无法打开流:无法设置数据通道:连接被拒绝
使用 Wireshark 过滤网络流量到 FTP 我看到了
Response: 220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
Request: USER user
Response: 331 User user OK. Password required
Request: PASS password
Response: 230 OK. Current restricted directory is /
Request: TYPE I
Response: 200 TYPE is now 8-bit binary
Request: SIZE filename
Response: 213 28344
Request: EPSV
Response: 229 Extended Passive mode OK (|||25127|)
Request: RETR filename
以下是一些 DNS 查询,然后是这些 TCP 帧:
60662 → 25127 [SYN] Seq=0 Win=64240 Len=0 MSS=1460 SACK_PERM=1 TSval=475196536 TSecr=0 WS=128
25127 → 60662 [RST, ACK] Seq=1 Ack=1 Win=0 Len=0
45764 → 21 [FIN, ACK] Seq=102 Ack=493 Win=64128 Len=0 TSval=475196552 TSecr=2527041209
不使用我得到的包装器
Response: 220---------- Welcome to Pure-FTPd [privsep] [TLS] ----------
Request: USER user
Response: 331 User user OK. Password required
Request: PASS password
Response: 230 OK. Current restricted directory is /
Request: PASV
Response: 227 Entering Passive Mode (89,31,148,62,184,87)
Request: TYPE A
Response: 200 TYPE is now ASCII
Request: RETR filename
Response: 150-Accepted data connection
Response: 226-File successfully transferred
Response: 226 Logout.
那似乎是EPSV的问题?
解决方案
Sooo 我想我的问题与https://bugs.php.net/bug.php?id=69580相同
PHP 的 FTP 包装器使用 EPSV,而ftp_pasv
使用带有 IPv4 的 PASV。我尝试从中下载的服务器存在 EPSV 问题,并且包装器不会回退到 PASV,因此出现错误。
可以要求服务器管理员修复他们的设置,但在我的情况下,这意味着我将无法使用包装器。
推荐阅读
- ravendb - 如何在 Ravendb 中更新数组中的值?我需要使用查询
- macos - 没有键盘快捷键的 NSMenuItem 替代项
- discord - 当一条消息中说出两个不同的词时,我的不和谐机器人是否会做出响应?
- sql-server - 将 Microsoft Access 数据库迁移到 SQL Server 2014
- xcode - 如何将 2x2x2 的 NDC 的 MVP 矩阵转换为 2x2x1 立方体(金属)的 NDC 的 MVP 矩阵?
- python - sklearn_pandas DataFrameMapper 弄乱了 OneHotEncoder 列名
- c++ - 如何将颜色表应用于我的灰度 8 位图像并在 Qt 中正确转换?
- video - 我想切换编解码器,或使用已安装的 UWP 编解码器,可以使用 playready
- gradle - Gradle 与 Bazel 的构建性能
- bash - Bash 修改远程服务器上的变量值(使用 ssh)并在我的本地服务器上使用它