如何用XMLstarlet或sed原地修改ActiveMQ XML的binding属性?
解决ActiveMQ配置文件的XML修改需求
原始配置文件
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <broker xmlns="http://activemq.apache.org/schema"> <jaas-security domain="activemq"/> <server configuration="file:/Users/gugu/Docs/artemis/var/lib/broker/etc//broker.xml"/> <web path="web" rootRedirectLocation="console"> <binding uri="https://localhost:8161"> <app url="activemq-branding" war="activemq-branding.war"/> <app url="artemis-plugin" war="artemis-plugin.war"/> <app url="console" war="console.war"/> </binding> </web> </broker>
修改需求
- 为
<binding>元素添加属性keyStorePath="$path/server-keystore.jks"和keyStorePassword="securepass"($path和密码为自定义变量) - 将
<binding>的uri属性端口从8161改为8443,最终目标效果:
<binding uri="https://localhost:8443" keyStorePath="$path/server-keystore.jks" keyStorePassword="securepass">
此前失败的命令
尝试使用XMLstarlet原地修改但无效果:
xmlstarlet edit --inplace \ --insert "/broker/web/binding[not(@keyStorePath)]" --type attr -n keyStorePath --value ".ssl/server-keystore.jks" \ bootstrap.xml
正确解决方案
方案1:XMLstarlet命令(推荐,适配XML规范)
之前失败的核心原因是未处理XML命名空间,原始配置的<broker>带有xmlns="http://activemq.apache.org/schema"命名空间,必须指定命名空间才能准确定位元素。
先定义自定义变量:
PATH_VAR="/your/actual/ssl/path" PASSWORD_VAR="securepass"
执行修改命令:
xmlstarlet edit --inplace \ -N amq="http://activemq.apache.org/schema" \ --update "/amq:broker/amq:web/amq:binding/@uri" --value "https://localhost:8443" \ --insert "/amq:broker/amq:web/amq:binding" --type attr -n keyStorePath --value "$PATH_VAR/server-keystore.jks" \ --insert "/amq:broker/amq:web/amq:binding" --type attr -n keyStorePassword --value "$PASSWORD_VAR" \ bootstrap.xml
命令说明:
-N amq="http://activemq.apache.org/schema":绑定命名空间前缀,确保XPath能匹配到目标元素--update:修改uri属性的端口值- 两次
--insert:为<binding>元素添加两个新属性
方案2:sed命令(适合简单场景,注意XML结构变化可能失效)
如果不想处理命名空间,可直接用sed做文本替换:
PATH_VAR="/your/actual/ssl/path" PASSWORD_VAR="securepass" # Linux环境 sed -i "s/<binding uri=\"https:\/\/localhost:8161\">/<binding uri=\"https:\/\/localhost:8443\" keyStorePath=\"$PATH_VAR\/server-keystore.jks\" keyStorePassword=\"$PASSWORD_VAR\">/" bootstrap.xml # macOS环境(需指定备份后缀) sed -i.bak "s/<binding uri=\"https:\/\/localhost:8161\">/<binding uri=\"https:\/\/localhost:8443\" keyStorePath=\"$PATH_VAR\/server-keystore.jks\" keyStorePassword=\"$PASSWORD_VAR\">/" bootstrap.xml
命令说明:
-i:原地修改文件(macOS需加备份后缀如.bak,会生成原文件的备份)- 直接匹配原始
<binding>行并替换为目标内容
内容的提问来源于stack exchange,提问作者Subhidh Agarwal
相关产品推荐
相关产品推荐

