gpt4 book ai didi

PHP ftp_put 返回 "Unable to build data connection: Connection refused"

转载 作者:可可西里 更新时间:2023-11-01 00:40:17 26 4
gpt4 key购买 nike

我有一台通过 PHP 运行一些 FTP 的 PC,我知道它在 1-2 个月前可以工作,但现在我回到它,我发现这台 PC 不再工作了。我知道我一直在使用 PC,但我想不出可能发生了什么变化。

PHP 正在抛出错误信息

Unable to build data connection: Connection refused

...当我使用 ftp_put() 函数时。

我使用的缩减代码是:

<?php

$trackErrors = ini_get('track_errors');
ini_set('track_errors', 1);

$server="***.***.***.***";
$port=21;
echo "<LI>Connecting to $server:$port<BR>";
$conn_id = ftp_connect($server,$port,9999999) or die("<BR>Unable to connect to ".$server.":$port server.");
if ( !$conn_id ) {
$errmsg = $php_errormsg;
echo "<BR><LI>ERR:$errmsg";
}
else {
$passive=false;
echo "<LI>Setting Passive Mode=$passive";
ftp_pasv($conn_id, $passive);

$user="*********";
$pass="*********";
echo "<LI>Connecting as $user/*****";
if (!ftp_login($conn_id, $user, $pass)) {
$msg = "Failed to login to $selected_server as $user; <BR>check logincredentials in the Settings";
echo "<BR><LI>$msg";

$errmsg = $php_errormsg;
echo "<LI>ERR:$errmsg";
return $msg;
}

ftp_set_option($conn_id, FTP_TIMEOUT_SEC, 10000);


if (!@ftp_put($conn_id, "test.txt", "C:......test.txt", FTP_BINARY)) {
echo "<BR><LI>ftp_put failed";

$errmsg = $php_errormsg;
echo "<LI>ERR:$errmsg";
}
echo "<HR>Done";
}
?>

将其作为网页运行时的输出是

Connecting to ***.***.***.***:21
Setting Passive Mode=
Connecting as *******/*****
ftp_put failed
ERR:ftp_put(): Unable to build data connection: Connection refused
Done

结果是 ftp_put() 给出错误消息并在服务器上留下一个具有正确文件名的零 (0) 字节文件。

奇怪的是

  1. 相同的代码/连接信息可以在另一台笔记本电脑上正常工作
  2. 在推送文件时使用 FileZilla 可以正常使用相同的连接信息
  3. 问题出现在多台服务器上(即,不仅仅是一个特定的目的地有问题)

此外,这似乎与被动模式没有任何关系(启用和不启用它都会失败)

有人有什么建议吗?
谢谢
安倍

最佳答案

您正在使用主动 FTP 模式。在主动模式下,服务器尝试连接到客户端。在大多数网络配置中,这是不可能的,因为客户端计算机通常位于防火墙后面。

这就是服务器失败的原因:

Unable to build data connection: Connection refused

这是专门针对这种情况的 ProFTPD 错误消息。

请参阅我关于 active and passive FTP connection modes 的文章了解详情。


代码可以在其他机器上运行,如果它们禁用了防火墙,或者如果它们有允许非特权端口上的传入流量的规则。

FileZilla 之所以有效,是因为它默认为被动模式(就像大多数现代 FTP 客户端所做的那样)。


你也声称尝试过被动模式,但得到了同样的错误信息。

那是因为您错误地使用了 ftp_pasv 调用。

您必须在 ftp_login 之后移动 ftp_pasv 调用

$user = "*********";
$pass = "*********";
echo "<LI>Connecting as $user/*****";
if (!ftp_login($conn_id, $user, $pass)) {
// ...
}

$passive = true;
echo "<LI>Setting Passive Mode=$passive";
ftp_pasv($conn_id, $passive);

The documentation明确表示:

Please note that ftp_pasv() can only be called after a successful login or otherwise it will fail.


对于类似的问题(仅针对 Pure-FTPd),请参阅 PHP upload via FTP - ftp_put() I won't open a connection to x.x.x.x (only to y.y.y.y) .

关于PHP ftp_put 返回 "Unable to build data connection: Connection refused",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42515533/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com