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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 20:02:40