Jenkins流水线无法读取服务器id_rsa导致远程SSH免密登录失败问题
问题根本原因
你遇到的是Jenkins运行用户和手动操作时的用户不一致导致的权限问题:
- 你手动执行命令时用的是root用户,所以能正常访问
/root/.ssh/下的密钥文件 - Jenkins服务默认以
jenkins用户运行,没有权限读取/root目录下的任何文件,所以在Pipeline里查看/root/.ssh/只能看到权限放开的authorized_keys,看不到私钥公钥文件,自然加载密钥失败。
推荐解决方案
方案1:为Jenkins用户单独配置SSH密钥(适合简单场景)
- 切换到Jenkins运行用户执行操作:
sudo su - jenkins -s /bin/bash - 生成专属SSH密钥对:
ssh-keygen -t rsa -b 4096,所有提示直接回车即可 - 将生成的
~/.ssh/id_rsa.pub内容添加到目标远程服务器的authorized_keys文件中 - 手动在jenkins用户下执行
ssh user@REMOTE_IP验证免密登录是否正常,验证通过后Pipeline就可以直接调用SSH命令了
方案2:通过Jenkins凭证管理配置密钥(更安全,官方推荐)
这种方式不需要把密钥存到Jenkins服务器本地文件系统,权限管控更规范:
- 进入Jenkins后台→「凭证」→「系统」→「全局凭据」,新增类型为SSH Username with private key的凭证:
- 用户名填远程服务器的登录账号
- 私钥栏粘贴你本地
id_rsa文件的全部内容 - 为凭证设置一个唯一标识ID,比如
remote_server_ssh_key
- 在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
相关产品推荐
相关产品推荐

