这个问题与这个问题一致,我正在尝试连接到安全的 FTP 服务器并且它无法连接,奇怪的部分是我能够执行 ssh 并连接到服务器但是当我尝试从 php 执行它时使用几种不同方法的代码,但它不起作用
方法:
- FTP 包装器
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 的代码:
Here am using same code as approach 1 but instead of ftp_connect, am using ftp_ssl_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 连接?
还有其他方法可以使用 php 连接到安全的 FTP 服务器吗?
更新:
Q1。我再次尝试使用 ftp_connect 但它刚刚消失了,为什么它消失了,ftp_connect 消失的场景是什么?
Q2。我们是否只有这种方法可以连接到服务器,或者还有其他我们可以实现的方法吗?
Q3。 这种 php 语言是否与它不支持安全 FTP 连接有关?或者有任何其他方法可以使用 php 执行此操作,如果是,则提供不同的方法,因为这将非常有帮助。
更新 1:
我试图在这个问题上进行更多的谷歌搜索,似乎如果 ftp_connect 不起作用,那么防火墙可能是它的原因之一。我不完全确定是否是这种情况,但我正在对此进行更多研究,如果我发现任何有用的信息,我会在此处发布更新。
可能的解决方案:
问题
如果我删除“或死”,那么你会得到错误:
从网页运行时:
警告:ftp_login() 期望参数 1 是资源,在第 28 行的 /var/www/ftp_test.php 中给出布尔值
var_dump($conn_id); 返回布尔值(假)。
从命令行 /usr/bin/php /var/www/ftp_test.php
var_dump($conn_id); 返回类型(FTP 缓冲区)的资源(4)。
脚本完成。
解决方案 1
这可能是一个solution
:
尝试关闭selinux
,这里是way
或搜索:如何禁用 selinux以暂时或永久关闭它。
解决方案 2
如果你不想完全关闭 selinux,你可以通过使用setsebool命令设置 httpd_can_network_connect 来获得你需要的东西。
验证它之前是否设置为“关闭”: getsebool httpd_can_network_connect
将其设置为“开”:
setsebool httpd_can_network_connect=1
重新打开 selinux:setenforce 1
检查以确保 phpftp_connect
在 httpd 下运行时仍然有效。
将策略 (-P) 设置为“on”,使其在重新启动后仍然存在:
setsebool -P httpd_can_network_connect=1
解决方案 3
公司防火墙也可能存在问题。确保已正确配置并正确设置了访问权限。
解决方案 4
另一种方法是使用cURL : libcurl,因为它可以用于连接和通信到具有许多不同类型协议的许多不同类型的服务器
解决方案 5
有一个名为PHP Secure Communication Library (phpspeclib)的开源项目,它也可用于建立与 FTP 服务器的安全连接。