从PHP连接到安全FTP服务器

14

这个问题与这个问题一致,我正在尝试连接到安全的FTP服务器,但无法连接,奇怪的是我能够通过ssh连接到服务器,但是当我尝试使用几种不同的方法从php代码中连接时,它不起作用。

方法:

  1. FTP包装器
  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".".....";
}

第三种方法的代码:

我使用与第一种方法相同的代码,但是使用ftp_ssl_connect代替了ftp_connect。

第四种方法的代码:

$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不起作用,则防火墙可能是其中之一的原因。我不完全确定是否是这种情况,但我正在进一步研究,并在此处发布更新,如果我找到任何有用的信息。

可能的解决方案:

问题

如果我删除“or die”,则会出现错误:

从网页运行时:

  

警告:ftp_login()期望参数1为资源,布尔值在/var/www/ftp_test.php的第28行返回

var_dump($conn_id);返回bool(false)。

从命令行/usr/bin/php /var/www/ftp_test.php

var_dump($conn_id);返回类型为FTP缓冲区的resource(4)。

脚本完成。

解决方案1

这可能是解决方案之一

尝试关闭selinux,并在此处查看way搜索:如何禁用selinux以暂时或永久地将其关闭。

解决方案2

如果您不想完全关闭selinux,则可以使用setsebool命令仅设置httpd_can_network_connect来获得所需内容。

验证先前是否将其设置为“关闭”:getsebool httpd_can_network_connect

将其设置为“打开”:

setsebool httpd_can_network_connect=1

重新启用selinux: setenforce 1

检查在httpd下运行时php的ftp_connect是否仍然有效。

设置策略(-P)为“on”,以便在重新启动后仍保持有效:

setsebool -P httpd_can_network_connect=1

解决方案3

公司防火墙也可能会出现问题。确保它被正确配置并具有适当的访问权限。

解决方案4

另一种方法是使用cURL:libcurl,因为它可以用于连接和与许多不同类型的服务器和协议进行通信。

解决方案5

有一个名为PHP安全通信库(phpspeclib)的开源项目,也可用于建立到FTP服务器的安全连接。


当您通过SSH登录到FTP时,是否来自运行您的PHP脚本的同一服务器?如果不是,则可能是DNS问题。 - Adam Hopkinson
当我通过ssh进入ftp时,我使用的是同一台服务器,所以我不确定这是否会成为一个问题? - user260204
sFTP不是FTP,它是SSH协议的一部分。FTP SSL是另一回事。这意味着方法1、2和3都行不通。也许你可以尝试使用ssh2_scp_send/ssh2_scp_recv来接收/发送文件? - Michał Piaskowski
5个回答

2
关于“通过ssh的ftp”别名“sftp”:没有直接建议,但请注意,许多便宜的“非专用服务器”网络主机不支持它(这很糟糕)。公司防火墙可能会阻止相关端口。
关于使用ssl/tls的ftp别名“ftps”:您可以在此处找到答案。不要浪费时间在ftp_ssl_connect()上 :-)
(是的,在php网站上文档非常差)

2
  1. 许多廉价的网络主机不会提供ssh(因此没有通过ssh进行ftp即sftp),而只提供ssl安全的ftp即ftps(在这里看看)。你可能会遇到这个问题。如其他人建议,使用filezilla或其他ftp客户端事先测试你的凭据和选择的安全方法。

  2. 至少在Windows下,ftp_ssl_connect()将是一段漫长的旅程,因为你必须编译自己的php二进制文件,在这里看看

  3. 正如这位php贡献者所指出的那样,只要你不知道你正在与谁交流,即“对等认证”通过有效证书,任何安全连接都不是安全的。

  4. phpseclib 可能是你最好的选择。但我还没有弄清楚如何确保它使用对等验证(猜测,真相在openssl.conf中...)

  5. 因此,即使在撰写本文时,我更加怀疑是否可能进行经过验证的ftps(ssl/tls认证的ftp)......也可以看看我的问题


1

0

在处理加密连接时,我也遇到了很多问题。

首先要检查你想使用的协议。安全FTP通常是指SSH上的FTP,但也可以是SCP、SFTP或FTPS。

一种找出方法的方式是使用像FileZilla这样的客户端进行连接。

如果协议是通过PHP模块处理的,最好的方法确实是使用它。在这种情况下,你需要确保除了与协议相关的模块外,还安装了OPENSSL模块。

有些情况下,模块支持仍然无法正常工作。在这种情况下,使用libcurl模块是一个选择。例如,当你需要使用客户端证书时就是这种情况。

不幸的是,在php模块中部分支持libcurl,你可能会再次遇到一些问题。我曾经遇到的一个场景是模块判断服务器证书无效。

我通常使用的最后一个解决方案是从exec语句运行curl二进制文件,对于后一种情况,使用“-k”开关。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接