1

我在我的项目中使用phpseclib。我已经安装了它,并正在使用以下与此处的示例类似的代码对其进行测试。

更新代码:

1           require("Net/SSH2.php");
2   
3           if (!class_exists('Net_SSH2')) die("Class Net_SSH2 doesn't exist!");
4           
5           $ssh = new Net_SSH2('***');   // the host IP address 
6           
7           if (!method_exists($ssh, 'Net_SSH2')) die("Net_SSH2 class doesn't have Net_SSH2 method!");
8    
9           if (!$ssh->login('***', '***')) {   // (verified) username and password
10              echo "LOG: " . $ssh->getLog() . "<br>";
11              exit('Login failed!');
12          }

代码更新 2:

1       require("Net/SSH2.php");
2
3       define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);
4
5       if (!class_exists('Net_SSH2')) die("Class Net_SSH2 doesn't exist!");
6       
7       $ssh = new Net_SSH2('***');   // the host IP address 
8       
9       if (!method_exists($ssh, 'Net_SSH2')) die("Net_SSH2 class doesn't have Net_SSH2 method!");
10
11      if (!$ssh->login('***', '***')) {   // (verified) username and password
12          echo "LOG: " . $ssh->getLog() . "<br>";
13          echo "ALL ERRORS: ";
14          print_r($ssh->getErrors());
15          echo "<br>LAST ERROR: " . $ssh->getLastError() . "<br>";
16          exit('Login failed!');
17      }

它在第 16 行退出。getLog()没有给出任何信息,因此很难知道问题出在哪里。我使用 PuTTY 测试了登录凭据。它也无法登录到其他服务器。我无法理解导致问题的原因。

任何帮助将不胜感激!

4

6 回答 6

1

Net_SSH2不是函数,这是该类中的一个类和构造函数。所以第三行应该是

if (!class_exists('Net_SSH2')) die("Class Net_SSH2 doesn't exist!");

如果您想进一步检查第 5 行之后Net_SSH2的类中是否存在方法,Net_SSH2您可以添加以下内容:

if (!method_exists($ssh, 'Net_SSH2')) die("Net_SSH2 class doesn't have Net_SSH2 method");
于 2012-07-31T17:21:20.570 回答
1

如果您点击您提供的链接上的“启用日志记录”按钮,您将看到在包含 Net/SSH2.php 之后立即完成以下操作:

define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);

试试看。

于 2012-07-31T20:16:58.283 回答
1

尝试在 PHP 脚本的顶部执行此操作:

error_reporting(E_USER_NOTICE);

将 error_reporting 设置为 0 会抑制 user_error,因此您的 PHP 设置很可能只是抑制了错误。例如。

error_reporting(E_USER_NOTICE);

user_error('zzzz', E_USER_NOTICE);

对比

error_reporting(0);

user_error('zzzz', E_USER_NOTICE);
于 2012-08-02T15:12:56.123 回答
0

当然,您可以将第 3 行更改为:

if( !class_exists('Net_SSH2')...

但我建议您进行一些异常处理。使用 PHPSecLib 时,除了问题什么都没有,所以我创建了这个 SSH2 类,它确实需要安装 PHP SSH2 扩展。

您应该尝试调用:getLog()以找出失败的原因。

echo $ssh->getLog();
于 2012-07-31T17:17:21.463 回答
0

我最终将我的代码托管在我试图连接的服务器(服务器 B)上。相同的代码以相反的方向工作(我可以连接到我之前的代码所在的服务器 A)!我最终得出结论,服务器 A 存在环境问题。我很感激那些在这里帮助我的人!

于 2012-08-02T19:14:13.747 回答
0

鉴于最新的评论,我假设您的代码存在于第 8 行(其中 Net_SSH2() 对象被实例化)......

我只是有一个非常相似的问题,一旦部署,include()就可以工作,但是check_exists()实例化一个新Net_SSH2对象会失败......但是使用 php 命令行工具解析我的 php 文件(在部署之前)可以正常工作......

所以问题出在服务器上(在我的例子中是 Apache):安装 phpseclib 的目录设置了权限,所以我什cd至无法访问它。

碰巧的是,我的 hoem 制作的部署脚本只是简单地复制服务器上的文件并设置奇怪的权限,以便无法访问 SSH2.php。

也许你在这里有类似的问题?

于 2012-10-04T09:31:41.843 回答