我在我的项目中使用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 测试了登录凭据。也无法登录其他服务器。我无法理解什么导致了问题。
任何帮助将不胜感激!
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");
如果您点击提供的链接上的“启用日志记录”按钮,您将看到在包含 Net/SSH2.php 后立即完成以下操作:
define('NET_SSH2_LOGGING', NET_SSH2_LOG_COMPLEX);
尝试一下。
尝试在 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);
当然你可以将第3行更改为:
if( !class_exists('Net_SSH2')...
但我建议你加入一些异常处理。使用 PHPSecLib 时,我除了问题什么也没有,所以我创建了这个 SSH2 类,它确实需要安装 PHP SSH2 扩展。
您应该尝试致电:
getLog()
以找出失败的原因。
echo $ssh->getLog();
我最终将代码托管在我尝试连接的服务器(服务器 B)上。相同的代码在相反的方向上工作(我可以连接到我之前的代码所在的服务器 A)!我最终得出的结论是服务器A存在环境问题。 我很感谢那些在这里帮助我的人!
鉴于最新的评论,我假设您的代码存在于第 8 行(Net_SSH2() 对象被实例化的地方)...
我刚刚遇到了一个非常类似的问题,一旦部署,
include()
就可以工作,但是check_exists()
并实例化一个新的Net_SSH2
对象将会失败......但是使用php命令行工具解析我的php文件(在部署之前)会很好用...
所以问题出在服务器上(在我的例子中是Apache):安装phpseclib的目录设置了权限,所以我什至无法
cd
它。
事实上,我制作的部署脚本只是复制服务器上的文件并设置奇怪的权限,以便无法访问 SSH2.php。
也许你也有类似的问题?