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

PHP ssh2_auth_pubkey_file认证失败,命令行却成功的排查求助

PHP ssh2_auth_pubkey_file 认证失败的调试方向

1. 排查密钥文件权限与PHP进程访问权限

  • 命令行下密钥文件权限通常为600,但PHP运行进程(如www-data)可能无读取权限。执行chmod 600 ~/.ssh/transpo_rsa确保权限合规,同时将~/.ssh目录权限设为700,保证PHP进程能进入该目录。
  • 可临时将密钥复制到PHP可访问的目录(如/tmp)并设置对应权限,验证是否为权限问题导致认证失败。

2. 验证密钥文件格式兼容性

  • PECL/ssh2对PEM格式要求严格,重新生成密钥时明确指定格式:
    ssh-keygen -t rsa -m PEM -f ~/.ssh/transpo_rsa
    
  • 检查私钥开头是否为-----BEGIN RSA PRIVATE KEY-----,公钥开头是否为ssh-rsa(而非-----BEGIN PUBLIC KEY-----),确保格式符合扩展要求。

3. 开启PHP SSH2扩展调试日志

  • 在代码中添加调试配置,获取更详细的错误信息:
    $connection = ssh2_connect('192.168.xxx.xx', 22);
    ssh2_set_debug($connection, SSH2_LOG_PROTOCOL);
    $result = ssh2_auth_pubkey_file(
        $connection,
        'roybatty',
        '/绝对路径/transpo_rsa.pub',
        '/绝对路径/transpo_rsa',
        '你的密码短语'
    );
    
  • 查看PHP错误日志或输出,获取比“Callback returned error”更具体的报错细节。

4. 消除命令行与PHP的环境差异

  • 命令行使用当前用户的环境变量,PHP进程的HOME路径可能不同,导致无法识别~路径。代码中务必使用密钥文件的绝对路径,避免使用~/.ssh/transpo_rsa这类相对路径。
  • 在PHP代码中执行echo getenv('HOME');,确认进程的HOME环境变量是否指向正确的用户目录。

5. 检查远程服务器SSH配置

  • 查看远程服务器/etc/ssh/sshd_config:
    • 确认PubkeyAuthentication yes已开启
    • 检查AuthorizedKeysFile路径是否为默认的~/.ssh/authorized_keys
    • 旧版本服务器需确认RSAAuthentication yes已配置
  • 修改配置后重启sshd服务:sudo systemctl restart sshd

6. 测试无密码短语的密钥对

  • 临时生成无密码短语的密钥对,验证是否为密码短语处理逻辑问题:
    ssh-keygen -t rsa -m PEM -f ~/.ssh/test_rsa -N ''
    
  • 将新公钥添加到远程服务器authorized_keys,用PHP的ssh2_auth_pubkey_file测试(省略密码短语参数),若成功则说明密码短语的处理存在异常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 19:03:21