xmlstarlet - 需要根据另一个属性的值有选择地替换属性值

问题描述 投票:0回答:1

只是想知道是否有人可以帮助我。 我目前正在构建 pfsense 防火墙,它使用 VPN 连接来保护流量。 VPN 提供商确实提供了端口转发机制,但传入端口号每小时都会发生变化。我有一个脚本可以让我发现新端口,但我需要一种脚本化方法来修改防火墙中的端口转发设置以匹配。

控制此功能的防火墙配置文件片段如下:

<?xml version="1.0"?>
<pfsense>
    <nat>
        <rule>
            <source>
                <any/>
            </source>
            <destination>
                <any/>
                <port>53400</port>
            </destination>
            <protocol>tcp/udp</protocol>
            <target>192.168.0.15</target>
            <local-port>53400</local-port>
            <interface>opt2</interface>
            <descr><![CDATA[Torrent]]></descr>
            <associated-rule-id>nat_52d81d2dc904f5.77023355</associated-rule-id>
            <created>
                <time>1389894957</time>
                <username>[email protected]</username>
            </created>
            <updated>
                <time>1389980696</time>
                <username>[email protected]</username>
            </updated>
        </rule>
    </nat>

    <filter>
        <rule>
            <id/>
            <type>pass</type>
            <interface>opt2</interface>
            <ipprotocol>inet</ipprotocol>
            <tag/>
            <tagged/>
            <max/>
            <max-src-nodes/>
            <max-src-conn/>
            <max-src-states/>
            <statetimeout/>
            <statetype>keep state</statetype>
            <os/>
            <protocol>tcp/udp</protocol>
            <source>
                <any/>
            </source>
            <destination>
                <address>192.168.0.15</address>
                <port>53400</port>
            </destination>
            <log/>
            <descr><![CDATA[NAT Torrent]]></descr>
            <associated-rule-id>nat_52d81d2dc904f5.77023355</associated-rule-id>
            <created>
                <time>1389894957</time>
                <username>NAT Port Forward</username>
            </created>
            <updated>
                <time>1389899075</time>
                <username>[email protected]</username>
            </updated>
        </rule>
    </filter>
</pfsense>

在上面的 XML 中,我们有两部分组成 pfsense 的端口转发规则。

<nat>
部分包围的部分是端口向前。
<rule>
中的部分是接口特定的传入防火墙规则。必须修改两者才能使新的端口转发设置生效。

我正在考虑使用 xmlstarlet 来修改配置文件,使用

<descr>
作为识别要更改哪些部分的关键。

我知道您可以拥有以下数据:

<username><![CDATA[name]]></username>
<password><![CDATA[password]]></password>
<dbname><![CDATA[name]]></dbname>

并修改为:

xml ed -P -O -L \
    -u '//username/text()' -v 'something' \
    -u '//password/text()' -v 'somethingelse' \
    -u '//dbname/text()'   -v 'somethingdifferent' \
    file.xml

而且你还可以有类似的东西:

<objects>
    <object>
        <name>Foo</name>
        <constant1>10</constant1>
        <constant2>20</constant2>
    </object>
    <object>
        <name>Bar</name>
        <constant1>15</constant1>
        <constant2>40</constant2>
    </object>
</objects>

并更新属性:

xmlstarlet ed -u '//object[name="Foo"]/const1' -v 18 sample.xml

但是,我正在努力将两者合并,以便我有一个匹配

<descr>="Torrent"
的语句,然后更新相关的
<port>
<local-port>
属性。

任何有关合适的 xmlstarlet 命令的帮助将不胜感激。

xmlstarlet
1个回答
4
投票
xmlstarlet ed \
  -u '//rule[descr="Torrent"]/destination/port' -v 1111 \
  -u '//rule[descr="Torrent"]/local-port' -v 2222 \
  sample.xml
© www.soinside.com 2019 - 2024. All rights reserved.