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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:42:45