You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

PHP通过SSH2实现服务器A到服务器B的连接配置问题求助

嘿,我之前在处理多密钥多SSH连接的场景时也踩过不少坑,结合你描述的配置,咱们一步步来排查和解决这个问题:

排查与解决方案

1. 先确认服务器B的SSH配置与权限合规性

SSH对密钥文件和目录的权限要求非常严格,这是最容易踩坑的点:

  • 服务器B上的/root/keys目录权限必须设置为700testomgeving.pub文件权限必须是600,否则SSH会直接拒绝使用这个密钥:
    chmod 700 /root/keys
    chmod 600 /root/keys/testomgeving.pub
    
  • 检查服务器B的sshd_config文件,确保已经配置了正确的授权密钥路径(因为你用了自定义路径存放公钥):
    打开/etc/ssh/sshd_config,确认存在类似配置:
    PubkeyAuthentication yes
    # 如果是针对root用户的自定义路径,可以添加这条(根据你的多用户场景调整)
    AuthorizedKeysFile    .ssh/authorized_keys /root/keys/testomgeving.pub
    
    修改后记得重启SSH服务:systemctl 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

火山引擎 最新活动