无法使用 SSH2 连接

问题描述 投票:0回答:6

我在我的项目中使用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 测试了登录凭据。也无法登录其他服务器。我无法理解什么导致了问题。

任何帮助将不胜感激!

php ssh phpseclib
6个回答
1
投票

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

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

如果你想进一步检查

Net_SSH2
方法是否存在于类
Net_SSH2
第 5 行之后,你可以添加以下内容:

if (!method_exists($ssh, 'Net_SSH2')) die("Net_SSH2 class doesn't have Net_SSH2 method");

1
投票

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

define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);

尝试一下。


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

0
投票

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

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

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

您应该尝试致电:

getLog()
以找出失败的原因。

echo $ssh->getLog();

0
投票

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


0
投票

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

我刚刚遇到了一个非常类似的问题,一旦部署,

include()
就可以工作,但是
check_exists()
并实例化一个新的
Net_SSH2
对象将会失败......但是使用php命令行工具解析我的php文件(在部署之前)会很好用...

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

cd
它。

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

也许你也有类似的问题?

© www.soinside.com 2019 - 2024. All rights reserved.