调用setPreferredAlgorithms触发TypeError,PHP+phpseclib问题求助
问题解决:phpseclib 3.0 setPreferredAlgorithms 触发 array_intersect 类型错误
问题原因
phpseclib 3.x版本中,setPreferredAlgorithms方法的hostkey参数要求传入数组类型,你当前传入的是字符串'ssh-dss',导致SSH2.php内部调用array_intersect函数时参数类型不匹配,触发TypeError。
解决方案
将hostkey对应的值改为数组格式,即使只有一个算法也要用数组包裹:
修改后的核心代码:
$key = $this->__getKeyWithFile($mykey, $myphrase); $sftp = new SFTP($host, $port); if (!empty($sftp)) { try { // 把字符串改为数组格式 $sftp->setPreferredAlgorithms(['hostkey' => ['ssh-dss']]); $sftp->login($user, $key); // 补充原代码遗漏的分号 } catch (Error $er) { echo $er->getMessage(); } catch (Exception $ex) { echo $ex->getMessage(); } }
补充说明
- 原代码中
$sftp->login($user, $key)末尾遗漏了分号,建议一并补上避免语法问题。 - 服务器更新后可能强化了SSH算法协商的校验逻辑,或phpseclib内部实现对参数类型要求更严格,导致原本能运行的字符串参数现在触发错误。
内容的提问来源于stack exchange,提问作者fliz
相关产品推荐
相关产品推荐

