使用 phpseclib 时出现“分段错误”

Posted

技术标签:

【中文标题】使用 phpseclib 时出现“分段错误”【英文标题】:"Segmentation fault" when using phpseclib 【发布时间】:2015-07-24 04:55:43 【问题描述】:

我从http://phpseclib.sourceforge.net/下载了phpseclib-0.3.10

我的php版本:PHP 5.2.4

操作系统:CentOS 6.6 版

当我在下面运行时,我在这一行 $ssh->login('username', 'password') 得到“分段错误”

<?php
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
include('Net/SSH2.php');
$ssh=new Net_SSH2('servername');
if (!$ssh->login('username', 'password')) 
     exit('Login Failed');

echo $ssh->exec('pwd');
?>

我找不到此问题的原因。请您帮我找出原因。

【问题讨论】:

您可能不想听到这个,但 PHP 5.2 已经过时,不再受支持。从那时起,已经做了很多很多的修复;可能已经修复了分段错误。 【参考方案1】:

我的猜测:要么是 fsockopen() 调用,要么是 stream_select() 调用。您可以通过将 die() 放入您的代码中 login() 中的连续点以及其中调用的函数来弄清楚。

正在查找... login() 调用 _login():

https://github.com/phpseclib/phpseclib/blob/0.3.10/phpseclib/Net/SSH2.php#L1801

_login() 调用 _connect():

https://github.com/phpseclib/phpseclib/blob/0.3.10/phpseclib/Net/SSH2.php#L1817

例如。在line 964 in Net/SSH2.php 之前添加die('this far')。如果它说“到目前为止”,然后尝试添加它。如果你在它之后但之前没有出现 seg 错误,这可能意味着应该归咎于 fsockopen。

然后继续这样做,直到出现 seg 错误。在 stream_select 之前和之后做一个die('this far'); ,就在哪里。然后贴出你正在使用的线路。

【讨论】:

感谢 neubert 的回复。我做了堆栈跟踪,我看到以下行抛出分段错误 Math_BigInteger->modPow() SSH2.php:1405 openssl_public_encrypt() BigInteger.php:1697 你能发布一个链接到你的 phpinfo() 吗?也许把它放在一个pastebin上并发布链接。谢谢!

以上是关于使用 phpseclib 时出现“分段错误”的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中使用向量时出现分段错误

分段错误:在 C++ 中弹出向量时出现 11

删除时出现分段错误

分配时出现分段错误[重复]

在 Swift 中使用 Set 时出现编译器分段错误

呈现窗口时出现 Gtkmm 分段错误