php - 从 PHP 连接到安全 FTP 服务器

标签 php ftp sftp

这个问题符合this question ,我正在尝试连接到安全 FTP 服务器,但它无法连接,奇怪的是我能够执行 ssh 并连接到服务器,但是当我尝试使用几种不同的方法从 php 代码中执行此操作时,但它是不工作

方法:

  1. FTP Wrappers
  2. ftp_connect & ftp_login
  3. ftp_ssl_connect
  4. ssh2_sftp
  5. 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这是 waySearch : 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 服务器的安全连接。

最佳答案

  1. 许多便宜的虚拟主机不会为您提供 ssh(因此没有通过 ssh 进行 ftp 又名 sftp),但仅限 ssl 安全的 ftp 又名 ftps ( see here )。你可能会 有这个问题。正如其他人建议的那样,使用 filezilla或者 另一个 ftp 客户端来测试您的信用和选择的安全方法 事先。

  2. ftp_ssl_connect()至少在windows下会是一个漫长的旅程, 因为你必须编译自己的 php 二进制文件,see here .

  3. As this php contributor rightfully points out ,没有安全 连接是安全的,只要你不知道你在和谁说话 也称为通过有效证书的“同行认证”。

  4. phpseclib可能是你最好的选择。但我还没弄清楚,如何 确保,它使用同行验证(猜测,事实是 openssl.conf ...)

  5. 因此,即使在撰写本文时,我也比以往任何时候都更想知道,是否 对等验证的 ftps(带有 ssl/tls 身份验证的 ftp)是可能的...另请参阅 my question here .

关于php - 从 PHP 连接到安全 FTP 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2172289/

相关文章:

java - 如何使用 JSch 进行原子 SFTP 文件传输,以便在写入过程完成之前无法访问文件?

Notepad++ NppFTP 插件无法通过 SFTP 连接

php - 我如何在 PHP 中四舍五入一个数字?

php - MySQL 中的日期时间格式不正确

c# - 在 Visual Studio 2013 上发布 Windows 服务

c# - 重命名从 FTP 服务器下载的文件,并使用重命名的文件上传到单独的 FTP 服务器

sftp - 尝试使用 Apache Mina 为 SFTP 测试服务器实现 PublicKey 身份验证。但是没有调用 Authenticate 方法

php - Ubuntu 替换 PHP 路径

javascript - 为后端和前端 View (PHP、Backbone)定义一次 HTML

c# - 如何在互联网中断后继续或恢复 FTP 上传