解决 jenkins 用户 SSH 连接目标服务器时的 Permission denied 问题
配置 SSH 密钥免密登录(核心是让目标服务器信任 jenkins
用户的公钥),步骤如下:
步骤 1:为 jenkins
用户生成 SSH 密钥对
在 Jenkins 所在服务器 执行以下命令:
# 切换到 jenkins 用户(-i 表示模拟登录,加载用户环境)
sudo -u jenkins -i# 生成 SSH 密钥对(一路回车,使用默认路径 `~/.ssh/id_rsa`,且不设置密码)
ssh-keygen -t rsa
执行后,jenkins
用户的 ~/.ssh/
目录会生成:
id_rsa
:私钥(需在 Jenkins 凭据中配置)。id_rsa.pub
:公钥(需复制到目标服务器)。
步骤 2:将公钥复制到目标服务器的 authorized_keys
在 Jenkins 所在服务器,执行以下命令,将 jenkins
的公钥同步到目标服务器(以 root
用户为例):
# 自动复制公钥到目标服务器的 ~/.ssh/authorized_keys
ssh-copy-id root@目标服务器ip
- 执行时会提示输入
root@192.168.195.128
的密码,输入正确密码后,公钥会被追加到目标服务器root
用户的~/.ssh/authorized_keys
文件中。
步骤 3:确保目标服务器允许 SSH 密钥登录
在 目标服务器 执行以下操作,检查并修改 SSH 服务配置:
# 编辑 SSH 服务配置文件
sudo vim /etc/ssh/sshd_config# 确保以下配置项存在且为正确值:
PermitRootLogin yes # 允许 root 用户登录(若需禁止 root 密码登录,可设为 PermitRootLogin without-password)
PubkeyAuthentication yes # 启用公钥认证
AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2 # 公钥文件路径# 重启 SSH 服务使配置生效
sudo systemctl restart sshd
步骤 4:测试 jenkins
用户的 SSH 连接
回到 Jenkins 所在服务器,再次切换到 jenkins
用户并测试 SSH 连接:
sudo -u jenkins -i
ssh root@目标服务器ip
- 若无需输入密码直接登录成功,说明 SSH 密钥免密登录配置完成。
步骤 5:给jenkins
用户 ~/.ssh
目录及文件权限
即使 known_hosts
内容正确,若权限过宽(如其他用户可读写),SSH 会拒绝读取,导致验证失败。在 Jenkins 所在服务器 执行:
# 1. 切换到 root 用户(或有 sudo 权限的用户)
sudo su -# 2. 修复 .ssh 目录权限(仅 jenkins 用户可读写)
chmod 777 /var/lib/jenkins/.ssh# 3. 修复 known_hosts 文件权限(仅 jenkins 用户可读写)
chmod 777 /var/lib/jenkins/.ssh/known_hosts# 4. 确认权限(输出应显示 jenkins:jenkins 且权限为 rwx------ 和 rw-------)
ls -ld /var/lib/jenkins/.ssh
ls -l /var/lib/jenkins/.ssh/known_hosts
后续:在 Jenkins 中配置 SSH 凭据
将 jenkins
用户的 私钥(~/.ssh/id_rsa
的内容)配置到 Jenkins 凭据中:
- 进入 Jenkins → 左侧 “管理 Jenkins” → “凭据” → “系统” → “全局凭据” → “添加凭据”。
- 选择 “SSH Username with private key” 类型,填写:
- Username:目标服务器的登录用户(如
root
)。 - Private Key:选择
Enter directly
,粘贴jenkins
用户~/.ssh/id_rsa
文件的完整内容。 - ID:自定义(如
dev-ssh-cred
,需与 Jenkinsfile 中引用的 ID 一致)。
- Username:目标服务器的登录用户(如
- 点击 “确定” 保存凭据。
总结
核心逻辑是:让 jenkins
用户拥有 SSH 密钥对 → 目标服务器信任该公钥 → Jenkins 通过凭据管理私钥,最终实现自动化 SSH 免密连接。配置完成后,Jenkins 执行 sshagent
、scp
、ssh
命令时将不再出现 Permission denied
错误。