13

这个问题与这个问题一致,我正在尝试连接到安全的 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".".....";
}

方法 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 服务器的安全连接。

4

5 回答 5

1

这个页面有你想要的(我认为)

http://kevin.vanzonneveld.net/techblog/article/make_ssh_connections_with_php/

这是手册页

http://php.net/manual/en/book.ssh2.php

于 2010-02-01T12:49:43.200 回答
1
  1. 许多便宜的虚拟主机不会给你 ssh(因此没有通过 ssh aka sftp 的 ftp),而只有 ssl-secured ftp aka ftps(见这里)。你可能有这个问题。正如其他人建议的那样,使用filezilla或其他 ftp 客户端预先测试您的信用和选择的安全方法。

  2. 至少在 windows 下 ftp_ssl_connect() 将是一个漫长的旅程,因为您必须编译自己的 php 二进制文件,请参见此处

  3. 正如这个 php 贡献者正确指出的那样,只要您不知道自己在说谁,也就是通过有效证书进行的“对等认证”,没有任何安全连接是安全的。

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

  5. 因此,即使在撰写本文时,我也比以往任何时候都更想知道,是否可以进行对等验证的 ftps(带有 ssl/tls 身份验证的 ftp)……也可以在这里查看我的问题

于 2014-02-19T11:29:45.973 回答
1

至于 'ftp via ssh' 别名 'sftp':没有直接建议,但请注意,许多廉价的“非专用服务器”网络主机不支持它(这很糟糕)。公司防火墙可能会阻止相关端口。

至于'ftp using ssl/tls' alias 'ftps': 你的答案在这里。不要浪费时间ftp_ssl_connect():-)

(是的,至少可以说,它在 php 网站上的记录很差)

于 2014-03-08T09:15:46.790 回答
0

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

首先是检查您要使用的协议。安全 FTP 最常指的是 FTP over SHH,但也可以指 SCP、SFTP 或 FTPS。

一种解决方法是使用像 filezilla 这样的客户端检查连接。

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

在某些情况下,模块支持仍然不起作用。在这种情况下,使用 libcurl 模块是一种选择。例如,当您需要使用客户端证书时就是这种情况。

不幸的是,在这里,由于 php 模块中对 libcurl 的部分支持,您可能会遇到一些问题。我实验的一种情况是服务器证书被模块判断为无效时。

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

于 2010-02-02T20:23:31.150 回答
0

我尝试了phpseclib 库,它适用于 Windows 和 Linux。

如果您使用的是作曲家,只需在您的要求部分添加:

"phpseclib/phpseclib": "0.3.*@dev"

然后,你可以这样做: http: //phpseclib.sourceforge.net/sftp/examples.html#put

于 2014-04-08T17:44:44.877 回答