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

Jenkins流水线无法读取服务器id_rsa导致远程SSH免密登录失败问题

问题根本原因

你遇到的是Jenkins运行用户和手动操作时的用户不一致导致的权限问题:

  • 你手动执行命令时用的是root用户,所以能正常访问/root/.ssh/下的密钥文件
  • Jenkins服务默认以jenkins用户运行,没有权限读取/root目录下的任何文件,所以在Pipeline里查看/root/.ssh/只能看到权限放开的authorized_keys,看不到私钥公钥文件,自然加载密钥失败。

推荐解决方案

方案1:为Jenkins用户单独配置SSH密钥(适合简单场景)

  1. 切换到Jenkins运行用户执行操作:sudo su - jenkins -s /bin/bash
  2. 生成专属SSH密钥对:ssh-keygen -t rsa -b 4096,所有提示直接回车即可
  3. 将生成的~/.ssh/id_rsa.pub内容添加到目标远程服务器的authorized_keys文件中
  4. 手动在jenkins用户下执行ssh user@REMOTE_IP验证免密登录是否正常,验证通过后Pipeline就可以直接调用SSH命令了

方案2:通过Jenkins凭证管理配置密钥(更安全,官方推荐)

这种方式不需要把密钥存到Jenkins服务器本地文件系统,权限管控更规范:

  1. 进入Jenkins后台→「凭证」→「系统」→「全局凭据」,新增类型为SSH Username with private key的凭证:
    • 用户名填远程服务器的登录账号
    • 私钥栏粘贴你本地id_rsa文件的全部内容
    • 为凭证设置一个唯一标识ID,比如remote_server_ssh_key
  2. 在Pipeline中通过sshagent插件调用凭证,示例代码如下:
pipeline {
    agent any
    stages {
        stage('执行远程操作') {
            steps {
                sshagent(credentials: ['remote_server_ssh_key']) {
                    sh 'ssh 你的远程用户名@REMOTE_IP "需要执行的远程命令"'
                }
            }
        }
    }
}

注意事项

  • 所有SSH相关的文件权限必须符合要求:.ssh目录权限设为700,私钥id_rsa权限设为600,否则SSH会出于安全考虑拒绝加载密钥
  • 不要为了省事直接把Jenkins运行用户改成root,会带来极大的安全风险

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 12:09:00