使用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
相关产品推荐
相关产品推荐

