Ubuntu 24.04中ssh2_auth_pubkey_file触发段错误(核心已转储)求助
问题描述
- 系统环境:Ubuntu 24.04
- 已执行的安装操作:
apt-get update apt-get install php apt-get install php-ssh2 - 测试代码(
test.php):$connection = ssh2_connect('x.x.x.x', 22); ssh2_auth_pubkey_file($connection, 'root', '/root/.ssh/id_rsa.pub', '/root/.ssh/id_rsa'); - 触发错误:
Segmentation fault (core dumped) - 异常情况:命令行执行
ssh root@x.x.x.x可正常登录目标服务器
解决方案
1. 修复php-ssh2扩展兼容性问题
Ubuntu 24.04默认仓库中的php-ssh2包存在已知的段错误bug,建议编译安装最新稳定版扩展:
# 卸载现有扩展 apt-get remove php-ssh2 # 安装编译依赖 apt-get install build-essential php-dev libssh2-1-dev # 通过pecl编译安装最新版 pecl install ssh2-1.4 # 在php.ini中启用扩展(路径可能为/etc/php/8.2/cli/php.ini,根据PHP版本调整) echo "extension=ssh2.so" >> /etc/php/8.2/cli/php.ini # 重启PHP服务(如使用FPM) systemctl restart php8.2-fpm
2. 严格校验密钥文件权限
确保密钥文件权限符合SSH安全规范,PHP运行时用户(即使是root)对权限的检查可能更严格:
chmod 700 /root/.ssh chmod 600 /root/.ssh/id_rsa chmod 644 /root/.ssh/id_rsa.pub
3. 添加调试逻辑定位问题
在代码中增加连接校验,避免空连接触发崩溃;同时可通过gdb分析核心转储文件:
$connection = ssh2_connect('x.x.x.x', 22); if (!$connection) { die('SSH连接失败'); } echo "连接成功,开始认证\n"; $authResult = ssh2_auth_pubkey_file($connection, 'root', '/root/.ssh/id_rsa.pub', '/root/.ssh/id_rsa'); var_dump($authResult);
若仍触发段错误,执行以下命令查看崩溃堆栈:
gdb php core (gdb) bt
4. 替代方案:使用纯PHP库phpseclib
如果php-ssh2扩展的问题无法解决,改用无需编译的纯PHP实现库:
# 通过composer安装 composer require phpseclib/phpseclib:^3.0
测试代码:
require 'vendor/autoload.php'; use phpseclib3\Net\SSH2; use phpseclib3\Crypt\RSA; $ssh = new SSH2('x.x.x.x'); $key = RSA::loadPrivateKey(file_get_contents('/root/.ssh/id_rsa')); if (!$ssh->login('root', $key)) { die('登录失败'); } echo "登录成功\n";
内容的提问来源于stack exchange,提问作者Richard Zintage
相关产品推荐
相关产品推荐

