这个问题符合this question ,我正在尝试连接到安全 FTP 服务器,但它无法连接,奇怪的是我能够执行 ssh 并连接到服务器,但是当我尝试使用几种不同的方法从 php 代码中执行此操作时,但它是不工作
方法:
- FTP Wrappers
-
ftp_connect
&ftp_login
-
ftp_ssl_connect
-
ssh2_sftp
-
ssh2-scp-send
&ssh2-scp-receive
-- 尚未尝试过这种方法,但在评论部分推荐,因此将致力于此,并稍后发布更新。
方法 1 的代码:
$ftp_server = "ftp://username:password@192.168.1.1:21/{$log_file_name}";
$opts = array('ftp' => array('overwrite' => TRUE));
$context = stream_context_create($opts);
$put_file = file_put_contents($ftp_server, $response, LOCK_EX,$context);
这里也无法连接到安全 FTP 服务器,对于无法连接的原因有什么建议吗?
方法 2 的代码:
ftp_server = 'www.server.com';
$conn_id = ftp_connect($ftp_server) or die ("Cannot connect to host");
//Program dies out here and give error message "Cannot connect to host",
//but why ftp_login does not work here, Any Suggestions ?
$ftp_user_name = "login";
$ftp_user_pass = "password";
// login with username and password
$login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
// check connection and login result
if ((!$conn_id) || (!$login_result))
{ echo "FTP connection has encountered an error!";
echo "Attempted to connect to $ftp_server for user $ftp_user_name....";
//exit;
} else
{
echo "Connected to $ftp_server, for user $ftp_user_name".".....";
}
方法 3 的代码:
此处使用与方法 1 相同的代码,但使用 ftp_ssl_connect 代替 ftp_connect
方法 4 的代码:
$connection = ssh2_connect('www.server.com', 22);
ssh2_auth_password($connection, 'login', 'password');
$sftp = ssh2_sftp($connection);
//exit();
$stream = fopen("ssh2.sftp://$sftp/path/to/file", 'r');
任何人都可以告诉我为什么我无法使用上述方法连接到安全 FTP 服务器,但仍然可以使用 ssh 连接到安全 FTP 服务器?
还有其他方法可以使用 php 连接到安全 FTP 服务器吗?
更新:
Q1.我再次尝试使用 ftp_connect,但它就死掉了,为什么会死掉,ftp_connect 在什么情况下死掉?
Q2.我们是否只有这种方法来连接到服务器,还是有其他我们可以实现的方法?
Q3. 这种 php 语言是否与它不支持安全 FTP 连接有关?或者还有其他方法可以使用 php 来做到这一点,如果是的话,那么提供不同的方法,因为这会非常有帮助。
更新1:
我试图在谷歌上更多地了解这个问题,似乎如果 ftp_connect 不起作用,那么防火墙可能是原因之一。我不完全确定情况是否如此,但我正在对此进行更多研究,如果我发现任何有用的内容,请在此处发布更新。
可能的解决方案:
问题
如果我删除“或死”,那么您会收到错误:
从网页运行时:
Warning: ftp_login() expects parameter 1 to be resource, boolean given in /var/www/ftp_test.php on line 28
var_dump($conn_id);返回 bool 值(假)。
从命令行/usr/bin/php/var/www/ftp_test.php
var_dump($conn_id);返回类型(FTP 缓冲区)的资源(4)。
脚本完成。
解决方案1
这可能是一个解决方案
:
尝试关闭selinux
这是 way
或Search : How to disable selinux用于暂时或永久关闭它。
解决方案2
如果你不想完全关闭selinux,你可以通过使用setsebool设置httpd_can_network_connect来获得你需要的东西。命令。
验证它之前是否设置为“关闭”: getsebool httpd_can_network_connect
将其设置为“打开”:
setsebool httpd_can_network_connect=1
重新打开 selinux: 设置强制1
检查以确保 php ftp_connect
在 httpd 下运行时仍然有效。
将策略 (-P) 设置为“on”,以便它在重新启动后仍然存在:
setsebool -P httpd_can_network_connect=1
解决方案3
公司防火墙也可能存在问题。确保其配置正确并且访问权限设置正确。
解决方案4
另一种方法是使用 cURL : libcurl因为它可用于通过多种不同类型的协议(protocol)连接到多种不同类型的服务器并进行通信
解决方案5
有一个名为 PHP Secure Communication Library (phpspeclib) 的开源项目它还可用于建立与 FTP 服务器的安全连接。
最佳答案
许多便宜的虚拟主机不会为您提供 ssh(因此没有通过 ssh 进行 ftp 又名 sftp),但仅限 ssl 安全的 ftp 又名 ftps ( see here )。你可能会 有这个问题。正如其他人建议的那样,使用 filezilla或者 另一个 ftp 客户端来测试您的信用和选择的安全方法 事先。
ftp_ssl_connect()至少在windows下会是一个漫长的旅程, 因为你必须编译自己的 php 二进制文件,see here .
As this php contributor rightfully points out ,没有安全 连接是安全的,只要你不知道你在和谁说话 也称为通过有效证书的“同行认证”。
phpseclib可能是你最好的选择。但我还没弄清楚,如何 确保,它使用同行验证(猜测,事实是 openssl.conf ...)
因此,即使在撰写本文时,我也比以往任何时候都更想知道,是否 对等验证的 ftps(带有 ssl/tls 身份验证的 ftp)是可能的...另请参阅 my question here .
关于php - 从 PHP 连接到安全 FTP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2172289/