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

如何通过编程方式修改Jenkins中SSH服务器凭据的密码

批量更新Jenkins SSH构建步骤密码的可行方案

直接替换config.xml里的<secretPassphrase>加密字符串无效,是因为Jenkins的密码加密依赖实例专属密钥,手动替换的加密内容无法被当前Jenkins解密,且直接修改磁盘文件不会触发Jenkins的配置重载。以下是两种可靠的编程式修改方案:

一、使用python-jenkins库批量更新

步骤说明

  1. 先安装依赖:
pip install python-jenkins
  1. 编写脚本遍历所有任务,识别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脚本批量更新

步骤说明

  1. 确保环境安装jq(用于解析Jenkins的JSON响应):
# Debian/Ubuntu
apt install jq
# RHEL/CentOS
yum install jq
  1. 编写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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 09:15:13