You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用phpseclib无法连接远程服务器的问题排查求助

phpseclib SSH连接特定服务器时出现unpack/extract错误

问题背景

  • 内部备份应用连接某台Digital Ocean服务器时异常,提取测试代码后,应用服务器和本地开发机均出现相同问题
  • 已在目标服务器开启密码日志,但无论是使用密码,还是用连接同服务商其他服务器的PEM文件,均无法完成登录
  • 测试环境(应用服务器/本地开发机)均为PHP8.1 + Ubuntu22.04;同服务商同配置的其他Droplet可正常连接,仅这台新服务器存在问题;更换为已知可用的凭据后,本地和备份服务器均可正常连接

测试代码(test-ssh.php,已修改地址、用户名和密码)

<?php
// Autoloader
include('./autoloader.php');
use phpseclib\Net\SSH2;

const NET_SSH2_LOGGING = 'NET_SSH2_LOG_COMPLEX';

ini_set('display_errors', true);
ini_set('error_log', 'php-error.log');

$ssh = new SSH2('123.123.123.123');
if (!$ssh->login('the-user', 'my-password')) {
    exit('Login Failed');
}

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

注:目标服务器SSH端口为22,故代码中未指定

初始现象

代码执行到$ssh->login行时无任何报错直接退出,无屏幕输出,日志文件也无新增内容

补充错误信息(开启完整错误报告后)

警告: unpack(): Type C: 输入不足,需要1个字节,实际获取0个字节 in /hdd/projects/local.backup.ecl/htdocs/phpseclib/Net/SSH2.php on line 1446

致命错误: 未捕获的TypeError: extract(): 参数#1 ($array)必须是array类型,给定的是bool类型 in /hdd/projects/local.backup.ecl/htdocs/phpseclib/Net/SSH2.php:1446
堆栈跟踪:
#0 /hdd/projects/local.backup.ecl/htdocs/phpseclib/Net/SSH2.php(1446): extract()
#1 /hdd/projects/local.backup.ecl/htdocs/phpseclib/Net/SSH2.php(1128): phpseclib\Net\SSH2->_key_exchange()
#2 /hdd/projects/local.backup.ecl/htdocs/phpseclib/Net/SSH2.php(1904): phpseclib\Net\SSH2->_connect()
#3 [内部函数]: phpseclib\Net\SSH2->_login()
#4 /hdd/projects/local.backup.ecl/htdocs/phpseclib/Net/SSH2.php(1888): call_user_func_array()
#5 /hdd/projects/local.backup.ecl/htdocs/test-ssh.php(12): phpseclib\Net\SSH2->login()
#6 {main}
  thrown in /hdd/projects/local.backup.ecl/htdocs/phpseclib/Net/SSH2.php on line 1446

内容的提问来源于stack exchange,提问作者ThurstonLevi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 07:21:24