如何用BASH或XMLStarlet修改XML中MySQL连接的密码
批量修改Java应用XML中MySQL连接密码的方案
方案一:使用XMLStarlet(推荐)
XMLStarlet是专门的XML命令行处理工具,能精准定位XML节点,避免正则匹配XML带来的格式兼容风险,适合长期维护场景。
1. 安装XMLStarlet
根据系统包管理器安装:
- Debian/Ubuntu系:
sudo apt-get install xmlstarlet
- RHEL/CentOS系:
sudo yum install xmlstarlet
2. 针对两种数据源的修改命令
处理HikariCP类型数据源(通过addDataSourceProperty配置密码)
命令会精准定位到MySQL(jdbc/MySQL)对应的Hikari配置块,替换密码:
xmlstarlet ed -P -S -L \ --update '//Call[@name="addService"]/Arg/New[@class="org.mortbay.jetty.plus.DefaultDataSourceService"]/Call[@name="addDataSource"][Arg="jdbc/MySQL"]/Arg/New[@class="com.zaxxer.hikari.HikariDataSource"]/Arg/New[@class="com.zaxxer.hikari.HikariConfig"]/Call[@name="addDataSourceProperty"][Arg="password"]/Arg[2]' \ --value "new_mysql_password" \ your_xml_file.xml
处理BoneCP类型数据源(直接通过Set配置密码)
定位到MySQL对应的BoneCP配置块替换密码:
xmlstarlet ed -P -S -L \ --update '//Call[@name="addService"]/Arg/New[@class="org.mortbay.jetty.plus.DefaultDataSourceService"]/Call[@name="addDataSource"][Arg="jdbc/MySQL"]/Arg/New[@class="com.jolbox.bonecp.BoneCPDataSource"]/Set[@name="password"]' \ --value "new_mysql_password" \ your_xml_file.xml
批量处理所有XML文件
如果要一次性修改当前目录下所有.xml文件,执行以下脚本:
for file in *.xml; do # 修HikariCP密码 xmlstarlet ed -P -S -L \ --update '//Call[@name="addService"]/Arg/New[@class="org.mortbay.jetty.plus.DefaultDataSourceService"]/Call[@name="addDataSource"][Arg="jdbc/MySQL"]/Arg/New[@class="com.zaxxer.hikari.HikariDataSource"]/Arg/New[@class="com.zaxxer.hikari.HikariConfig"]/Call[@name="addDataSourceProperty"][Arg="password"]/Arg[2]' \ --value "new_mysql_password" \ "$file" # 修改BoneCP密码 xmlstarlet ed -P -S -L \ --update '//Call[@name="addService"]/Arg/New[@class="org.mortbay.jetty.plus.DefaultDataSourceService"]/Call[@name="addDataSource"][Arg="jdbc/MySQL"]/Arg/New[@class="com.jolbox.bonecp.BoneCPDataSource"]/Set[@name="password"]' \ --value "new_mysql_password" \ "$file" done
参数说明:
-ed:进入编辑模式-P:保留原XML的格式(不自动重新排版)-S:保留原文件的空格缩进-L:直接修改原文件(若需保留原文件备份,去掉-L后将输出重定向到新文件即可)
方案二:使用BASH + sed(快速临时处理)
sed适合XML格式固定、无复杂嵌套变化的场景,注意:如果XML的缩进、换行格式发生变化,该命令可能失效,且可能误改非MySQL连接的密码块。
1. 处理HikariCP类型数据源
匹配addDataSourceProperty下的密码节点并替换:
sed -i '/<Call name="addDataSourceProperty">/,/<\/Call>/ { /<Arg>password<\/Arg>/ { n s/<Arg>.*<\/Arg>/<Arg>new_mysql_password<\/Arg>/ } }' your_xml_file.xml
2. 处理BoneCP类型数据源
直接匹配密码配置行替换:
sed -i 's/<Set name="password">.*<\/Set>/<Set name="password">new_mysql_password<\/Set>/g' your_xml_file.xml
3. 批量处理所有XML文件
for file in *.xml; do # 处理HikariCP密码 sed -i '/<Call name="addDataSourceProperty">/,/<\/Call>/ { /<Arg>password<\/Arg>/ { n s/<Arg>.*<\/Arg>/<Arg>new_mysql_password<\/Arg>/ } }' "$file" # 处理BoneCP密码 sed -i 's/<Set name="password">.*<\/Set>/<Set name="password">new_mysql_password<\/Set>/g' "$file" done
注意:
-i:直接修改原文件(部分Linux发行版需使用-i.bak生成原文件的备份)
内容的提问来源于stack exchange,提问作者supmethods
相关产品推荐
相关产品推荐

