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

