PHP通过SSH2实现服务器A到服务器B的连接配置问题求助
嘿,我之前在处理多密钥多SSH连接的场景时也踩过不少坑,结合你描述的配置,咱们一步步来排查和解决这个问题:
排查与解决方案
1. 先确认服务器B的SSH配置与权限合规性
SSH对密钥文件和目录的权限要求非常严格,这是最容易踩坑的点:
- 服务器B上的
/root/keys目录权限必须设置为700,testomgeving.pub文件权限必须是600,否则SSH会直接拒绝使用这个密钥:chmod 700 /root/keys chmod 600 /root/keys/testomgeving.pub - 检查服务器B的
sshd_config文件,确保已经配置了正确的授权密钥路径(因为你用了自定义路径存放公钥):
打开/etc/ssh/sshd_config,确认存在类似配置:
修改后记得重启SSH服务:PubkeyAuthentication yes # 如果是针对root用户的自定义路径,可以添加这条(根据你的多用户场景调整) AuthorizedKeysFile .ssh/authorized_keys /root/keys/testomgeving.pubsystemctl restart sshd
2. 先手动测试SSH连接(排除PHP层面的问题)
在服务器A上用命令行手动连接服务器B,指定你的私钥文件,验证基础的SSH密钥认证是否正常:
ssh -i /root/.ssh/id_rsa root@服务器B的IP地址
如果手动连接失败,那问题出在SSH本身的配置或密钥匹配上,先解决这个问题再看PHP代码;如果手动连接成功,再聚焦到PHP SSH2的代码实现上。
3. 修正PHP SSH2的代码实现
确保你的PHP代码正确指定了密钥文件,并且PHP进程有读取这些文件的权限:
<?php // 连接服务器B $serverBIP = '你的服务器BIP'; $connection = ssh2_connect($serverBIP, 22); if (!$connection) { die('无法建立与服务器B的SSH连接'); } // 使用公钥私钥认证 $authSuccess = ssh2_auth_pubkey_file( $connection, 'root', // 服务器B的登录用户名 '/root/.ssh/id_rsa.pub', // 服务器A上的公钥路径 '/root/.ssh/id_rsa', // 服务器A上的私钥路径 '' // 如果私钥设置了密码,这里填写密码,否则留空 ); if (!$authSuccess) { die('公钥认证失败,请检查密钥配置与权限'); } // 认证成功后执行测试命令 $stream = ssh2_exec($connection, 'pwd'); stream_set_blocking($stream, true); $output = stream_get_contents($stream); echo "服务器B当前目录:{$output}"; // 关闭连接 fclose($stream); ?>
⚠️ 注意:如果你的PHP进程是以非root用户(比如www-data)运行的,它可能没有权限读取/root/.ssh/下的密钥文件。这种情况可以把密钥复制到PHP用户的家目录(比如/var/www/.ssh/),并修改所有权为www-data:
cp /root/.ssh/id_rsa* /var/www/.ssh/ chown -R www-data:www-data /var/www/.ssh/ chmod 600 /var/www/.ssh/id_rsa chmod 644 /var/www/.ssh/id_rsa.pub
然后修改PHP代码里的密钥路径为/var/www/.ssh/id_rsa和/var/www/.ssh/id_rsa.pub。
4. 查看SSH日志定位具体问题
如果以上步骤都没解决,查看服务器B的SSH日志(一般在/var/log/auth.log或/var/log/secure),里面会有详细的失败原因,比如:
Authentication refused: bad ownership or modes for directory /root/keys:权限问题No matching key found:公钥未正确配置或不匹配
根据日志提示针对性调整即可。
内容的提问来源于stack exchange,提问作者Lex Nagtegaal




