无法使用SSH2连接

时间:2012-07-31 15:47:55

标签: php ssh

我在我的项目中使用phpseclib。我已安装它并使用以下代码进行测试,该代码类似于示例here

更新代码:

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测试了登录凭据。它也无法登录其他服务器。我无法理解导致问题的

任何帮助都将受到高度赞赏!

6 个答案:

答案 0 :(得分:1)

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

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");

答案 1 :(得分:1)

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

define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);

试试。

答案 2 :(得分:1)

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

error_reporting(E_USER_NOTICE);

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

error_reporting(E_USER_NOTICE);

user_error('zzzz', E_USER_NOTICE);

VS

error_reporting(0);

user_error('zzzz', E_USER_NOTICE);

答案 3 :(得分:0)

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

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

但我建议你抛出一些异常处理。当使用PHPSecLib时,我只有问题,所以我创建了this SSH2 Class,它确实需要安装PHP SSH2扩展。

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

echo $ssh->getLog();

答案 4 :(得分:0)

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

答案 5 :(得分:0)

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

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

所以问题发生在服务器上(在我的情况下是Apache):安装phpseclib的目录设置了权限,以至于我甚至无法cd

事实上,我的部署脚本只是复制服务器上的文件并设置奇数权限,以便无法访问SSH2.php。

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