1

bashスクリプトを介してmobileconfigファイル(別名iOSプロファイル、XML)を生成(実際に編集)しています。

スクリプトは MS データベースからデータをフェッチし、このデータを mobileconfig ファイル (XML) に挿入/置換する必要があります。

XML ファイルの構造は次のとおりです。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>PayloadContent</key>
    <array>
        <dict>
            <key>Host</key>
            <string>outlook.office365.com</string>
            <key>MailNumberOfPastDaysToSync</key>
            <integer>7</integer>
            <key>Password</key>
            <string>ActiveSyncPassword</string>
            <key>PayloadDescription</key>
            <string>Configures an Exchange account</string>
            <key>PayloadDisplayName</key>
            <string>Exchange ActiveSync</string>
            <key>PayloadVersion</key>
            <integer>1</integer>
            <key>SSL</key>
            <true/>
            <key>UserName</key>
            <string>xxxxxxx@xxx.com</string>
            <key>disableMailRecentsSyncing</key>
            <false/>
        </dict>
        <dict>
            <key>AutoJoin</key>
            <true/>
            <key>EncryptionType</key>
            <string>WPA</string>
            <key>HIDDEN_NETWORK</key>
            <true/>
            <key>IsHotspot</key>
            <false/>
            <key>Password</key>
            <string>WEPWPAWPSPEAPTLS</string>
            <key>PayloadType</key>
            <string>com.apple.wifi.managed</string>
            <key>PayloadVersion</key>
            <real>1</real>
            <key>ProxyType</key>
            <string>None</string>
            <key>SSID_STR</key>
            <string>SSID</string>
        </dict>
        <dict>

WiFi パスワードだけでなく、ネイティブ (xmllint、sed) または非ネイティブ ツールを使用して < string> < /string> の間の ActiveSync "Password" フィールドも置き換えたいと考えています。

誰でも助けてもらえますか?

4

2 に答える 2

3

プレーンテキスト ツールを使用して構造化データ (XML など) を編集すると、ファイル形式が変更されると誰も予期しない方法で変更されると (無害な空白の挿入など)、必ず悲惨な結果になります。代わりに、XML を適切に解析し、ツリーで機能するツール ( xmlstarlet.

これの一般的な形式は次のとおりです。

xmlstarlet ed -u xpath -v value filename.xml

xpathは更新するノードを識別する XPath 式で、 はノードにvalue与える新しい値です。マジックは、更新するノードを一意かつ確実に識別する XPath 式を構築することにあります。MobileConfig XML 形式では、これが通常よりやや難しくなります。コメントで議論した後、私たちは最終的に

xmlstarlet ed -u '//dict[key[text() = "PayloadDisplayName"]/following-sibling::string[1] = "Exchange ActiveSync"]/key[text() = "Password"]/following-sibling::string[1]' -v 'abc123' filename.xml

この核となるのは XPath 式です

//dict[key[text() = "PayloadDisplayName"]/following-sibling::string[1] = "Exchange ActiveSync"]/key[text() = "Password"]/following-sibling::string[1]

..これには説明が必要です。次の機能を使用します。

  • //dictdictドキュメント内の任意のノードに一致し、
  • //dict/keykeyノードの子である任意のノードに一致しdict
  • //dict/key[text() = "Password"]ノードkeyの子でありdict、テキストPassword
  • //dict/key[text() = "Password"]/following-siblingそのようなノードの後続の兄弟ノード、keyつまり、同じ親の子でありkey、XML 内のノードの後に​​あるノードに一致します。
  • //dict/key[text() = "Password"]/following-sibling::stringstringそのような次の兄弟ノードである任意のノードに一致し、
  • //dict/key[text() = "Password"]/following-sibling::string[1]そのようなノードの最初に続く兄弟stringノードである任意のノードに一致しkeyます。

ですでに条件を使用してい//dict/key[text() = "Password"]ます。dictパスワード エントリを変更するノードを見つけるには、さらに多くの情報が必要です。dict見つけたいノードは、

//dict[key[text() = "PayloadDisplayName"]/following-sibling::string[1] = "Exchange ActiveSync"]

dict条件を満たすノードです

key[text() = "PayloadDisplayName"]/following-sibling::string[1] = "Exchange ActiveSync"

この条件の XPath 式はすべて、dictテスト対象のノードに関連しているため、

key[text() = "PayloadDisplayName"]

テキストを含むkeyそのノードのサブノードを参照し、dictPayloadDisplayName

key[text() = "PayloadDisplayName"]/following-sibling::string[1] = "Exchange ActiveSync"

テキストを含むノードstringの次のノードのテキストが である場合、 は trueです。したがって、それを上で説明した簡略化された式に入れ、完全なフィルターを取得します。keyPayloadDisplayNameExchange ActiveSync

この XML ファイルの構造により、全体が必要以上に、または通常よりも困難になっていることを指摘せざるを得ません。適切に構造化された XML は、はるかに単純な XPath 式で処理できます (ほとんどの場合)。

于 2015-06-23T10:14:22.393 に答える
1

あなたはこのようにすることができます

sed -r "s#(<string>)SSID_STR(</string>)#\1AMD\2#g" File

インプレース置換の場合:

sed -i -r "s#(<string>)SSID_STR(</string>)#\1AMD\2#g" File

()グループ化に使用されます。\1およびそのようなグループを\2表します。AMD を実際のコンテンツに置き換えます。同様に、パスワードについてもできます。firstsecond

于 2015-06-23T06:33:15.513 に答える