如何通过编程方式修改Jenkins中SSH服务器凭据的密码
批量更新Jenkins SSH构建步骤密码的可行方案
直接替换config.xml里的<secretPassphrase>加密字符串无效,是因为Jenkins的密码加密依赖实例专属密钥,手动替换的加密内容无法被当前Jenkins解密,且直接修改磁盘文件不会触发Jenkins的配置重载。以下是两种可靠的编程式修改方案:
一、使用python-jenkins库批量更新
步骤说明
- 先安装依赖:
pip install python-jenkins
- 编写脚本遍历所有任务,识别SSH构建步骤并更新密码:
import jenkins from xml.etree import ElementTree as ET # 配置Jenkins连接信息 JENKINS_URL = "http://你的Jenkins地址" USERNAME = "你的用户名" API_TOKEN = "你的用户API Token" # 在Jenkins个人设置中生成 NEW_PASSWORD = "新的SSH密码" # 连接Jenkins服务 server = jenkins.Jenkins(JENKINS_URL, username=USERNAME, password=API_TOKEN) # 获取所有任务列表 jobs = server.get_jobs() for job in jobs: job_name = job["name"] try: # 获取任务的XML配置 config_xml = server.get_job_config(job_name) root = ET.fromstring(config_xml) # 定位SSH构建步骤(处理Jenkins XML命名空间) ns = {"ssh": "hudson.plugins.ssh"} ssh_steps = root.findall(".//ssh:SSHBuildStep", namespaces=ns) if ssh_steps: for step in ssh_steps: # 找到密码标签并替换为明文密码(Jenkins会自动加密存储) secret_pass = step.find("secretPassphrase") if secret_pass is not None: secret_pass.text = NEW_PASSWORD # 将修改后的XML转换为字符串并提交更新 updated_config = ET.tostring(root, encoding="utf8", method="xml").decode("utf8") server.reconfig_job(job_name, updated_config) print(f"已更新任务 {job_name} 的SSH密码") except Exception as e: print(f"更新任务 {job_name} 失败: {str(e)}")
注意事项
- 必须使用用户的API Token而非登录密码,避免密码泄露且权限更适配API操作
- 脚本会自动处理XML命名空间,确保准确匹配SSH构建步骤
- 支持单个任务包含多个SSH构建步骤的场景
二、使用CURL+Shell脚本批量更新
步骤说明
- 确保环境安装
jq(用于解析Jenkins的JSON响应):
# Debian/Ubuntu apt install jq # RHEL/CentOS yum install jq
- 编写Shell脚本批量处理:
#!/bin/bash # 配置参数 JENKINS_URL="http://你的Jenkins地址" USER="你的用户名" API_TOKEN="你的用户API Token" NEW_PASSWORD="新的SSH密码" # 获取所有任务名称 JOBS=$(curl -s -u ${USER}:${API_TOKEN} ${JENKINS_URL}/api/json | jq -r '.jobs[].name') for JOB in ${JOBS}; do echo "开始处理任务: ${JOB}" # 下载任务配置XML curl -s -u ${USER}:${API_TOKEN} ${JENKINS_URL}/job/${JOB}/config.xml -o temp_config.xml # 替换SSH密码(注意匹配带命名空间的标签) sed -i "s|<ssh:secretPassphrase>.*</ssh:secretPassphrase>|<ssh:secretPassphrase>${NEW_PASSWORD}</ssh:secretPassphrase>|g" temp_config.xml # 提交更新后的配置 curl -X POST -u ${USER}:${API_TOKEN} -H "Content-Type: text/xml" --data-binary @temp_config.xml ${JENKINS_URL}/job/${JOB}/config.xml echo "任务 ${JOB} 更新完成" done # 清理临时文件 rm -f temp_config.xml
注意事项
- 测试阶段先针对单个任务验证脚本逻辑,避免批量操作出错
- 如果Jenkins XML中没有命名空间,可将sed命令中的
ssh:前缀去掉 - 脚本执行前确保用户有足够权限修改所有目标任务的配置
内容的提问来源于stack exchange,提问作者Heinz
相关产品推荐
相关产品推荐

