大家好我很感激这个问题已经被问到Notice: No compatible server to client encryption algorithms found in但提供的建议和答案并没有解决我的问题,也没有以任何方式深入探讨这个问题,并解释了'stream_resolve_include_path()'工作,重新启动apache没有解决我的问题,也没有我尝试过的包含路径说明。
我相信我的问题与路径有关(可能包括路径或者可能是由于我的目录结构,但我不确定如何修复。
我正在尝试通过phpseclib连接到远程服务器,当我将文件包含在文档根目录的子目录中时,它可以正常工作,但我在根目录中运行的脚本会在我的问题中引发错误。
phpseclib从根运行,因此我有一个目录结构如下:
docroot(调用脚本的文件失败)
我的工作文件的简化版本如下:
<?php
set_include_path( '..' . DIRECTORY_SEPARATOR);
include_once ('Net/SSH2.php');
public function updatessh($sshId, $sshAddress, $sshUserName, $sshPassword, $port = 22) {
$ssh = new Net_SSH2($sshAddress, $port);
if (!ssh->login($sshUserName, $sshPassword)) {
// Login failed
... code for failure
} else {
// Login success
... code for success
}
这很好用,我通过ssh登录并可以处理请求。
docroot中我的非工作代码片段几乎完全相同,如下所示:
<?php
set_include_path(DIRECTORY_SEPARATOR);
include_once ('Net/SSH2.php');
public function updatessh($sshId, $sshAddress, $sshUserName, $sshPassword, $port = 22) {
$ssh = new Net_SSH2($sshAddress, $port);
if (!ssh->login($sshUserName, $sshPassword)) {
// Login failed
... code for failure
} else {
// Login success
... code for success
}
传递给这些函数的所有参数都是正确的,并且多次尝试解决此问题。
我尝试了与工作示例相同的包含路径,附加$ _SERVER ['DOCUMENT_ROOt']不起作用,并且没有包含失败。
我很茫然,必须在这里丢失一些东西,包含它之后的文件然后调用它自己的包含来获取Crypt文件夹的权利,肯定会是相同的没有?
phpseclib的版本是0.3.something,我也尝试使用版本1(它使用命名空间但完全没有成功,因为这有点工作恢复到这个项目的非命名空间版本。
任何指针都将不胜感激。
答案 0 :(得分:2)
包括以下顶部为我工作:
set_include_path(getcwd());
答案 1 :(得分:0)
通过set_include_path(DIRECTORY_SEPARATOR);
这是胡说八道。您已经说过phpseclib代码和代码都位于文档根目录中。我将假设文档根是文件系统中的子目录,例如&#39;在/ var / www / html等&#39;而不是&#39; /&#39;,但后者正是您指定的phpseclib文件的位置。
如果将上面的行更改为:
set_include_path('.' . DIRECTORY_SEPARATOR);
它应该导致与您说的脚本相同的行为,但这不是一个好的解决方案。
首先需要决定是否将phpseclib视为应用程序的嵌入式部分或应用程序所在平台的一部分。对于前者,您应该在项目目录中有一个包含phpseclib dirs的目录。在第二种情况下,phpseclib应该与您的项目一起位于单个目录中。
理想情况下,您应该在文档根目录之外保留尽可能多的代码以减少攻击面。在您想要构建易于部署的可移植应用程序的情况下,嵌入库使这变得不可能 - PHP没有任何方法来指示应该将代码部署到何处。但是,上述方法允许使用一致的模型来管理(和重新使用)系统上的第三方组件。
将组件放在其他位置意味着您可以使用静态包含路径包含文件。嵌入组件意味着您需要动态确定包含路径。如果您沿着嵌入式根目录运行,那么建立一个基准目录(通常是项目的基本目录),您可以从中找到所需的任何其他资源。
最后,不要替换脚本中的include路径 - 添加它。请注意,向路径添加条目的顺序是显着的(从左到右搜索列表),例如。
$ipath=ini_get('include_path');
switch (DIRECTORY_SEPERATOR) {
case '/':
set_include_path(PROJECT_BASE . "/include"
. (strlen($ipath) ? ":$ipath" : ""));
break;
case '\\':
set_include_path(PROJECT_BASE . "/include"
. (strlen($ipath) ? ";$ipath" : ""));
break;
default:
trigger_error("Unable to resolve system semantics", E_USER_ERROR);
exit -1;
}
include_once ('phpseclib/Net/SSH2.php');
答案 2 :(得分:0)
我找到的一个解决方案是:
这很好用,取决于你的设置,我必须添加
set_include_path(get_include_path() . PATH_SEPARATOR . APPPATH . 'third_party/phpseclib');
如其文档中所示,因为 Net / SSH2.php做了一些自己没有的工作 phpseclib在路上。
答案 3 :(得分:0)
有时此错误会引发文件范围的bcoz。 将您的业务逻辑代码(php文件)放在Project_Name / phpseclib文件夹中,然后尝试。
答案 4 :(得分:0)
之所以要继续前面的答案,是因为使用如下代码加载了加密算法:
if (class_exists('\phpseclib\Crypt\Rijndael') === false) {
$encryption_algorithms = array_diff(
$encryption_algorithms,
array('aes128-ctr', 'aes192-ctr', 'aes256-ctr', 'aes128-cbc', 'aes192-cbc', 'aes256-cbc')
);
}
因此,如果您的代码以非标准方式加载phpseclib,则不会加载包含算法的类,则SSH2对象将假定它没有加密算法,并且会收到错误消息。
您可能会发现可以根据需要直接加载算法,例如:
require 'vendor/phpseclib/phpseclib/phpseclib/Crypt/Rijndael.php';