Bash - 在 plist 文本文件中修改 WhitelistedBlockedPlugins

Posted

技术标签:

【中文标题】Bash - 在 plist 文本文件中修改 WhitelistedBlockedPlugins【英文标题】:Bash - modifying WhitelistedBlockedPlugins in plist text file 【发布时间】:2013-07-11 23:01:02 【问题描述】:

我正在尝试自动为 Safari 添加有关 Java 的其他被阻止的应用程序和站点的白名单。我可以导出二进制 plist 并通过 bash 对其进行编辑,但我不知道如何搜索和替换或简单地添加到具有特定位置的文件中。

<?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>BookmarksSidebarWidth</key>
    <real>194</real>
        ...
    <key>WhitelistedBlockedPlugins</key>
    <array>
        <dict>
            <key>PluginHostname</key>
            <string>www.java.com</string>
            <key>PluginIdentifier</key>
            <string>com.oracle.java.JavaAppletPlugin</string>
            <key>PluginLastVisitedDate</key>
            <date>2013-06-05T17:03:26Z</date>
            <key>PluginName</key>
            <string>Java Applet Plug-in</string>
            <key>PluginPageURL</key>
            <string>http://www.java.com/en/download/testjava.jsp</string>
            <key>PluginPolicy</key>
            <string>PluginPolicyBlockWhenInsecure</string>
        </dict>
    </array>
    ...
    <key>com.apple.Safari.ContentPageGroupIdentifier.WebKit2UsesPageCache</key>
    <true/>
</dict>
</plist>

<key>WhitelistedBlockedPlugins</key>
<array>
    <dict>
        ....
        ....
    </dict>
</array>

是我想要搜索和替换或添加的位(如果它不存在)。如果存在,则可以替换以&lt;key&gt;WhitelistedBlockedPlugins&lt;/key&gt; 开头并以结束&lt;/array&gt; 结尾的所有内容,因为无论如何我们都想控制其中的内容。

如果它不存在,我想我可以在文件末尾最后的&lt;/dict&gt; 之前添加它。

这是我想出的逻辑,但我很难找到可以搜索的解决方案,如果找到则替换,如果找不到则添加。

在阅读 Stack Overflow 上的类似帖子后,我尝试了一些事情但没有成功。我愿意使用任何 OSX 原生的东西,包括 XCode/CLI 工具附带的东西。

我尝试过的事情:

echo 进入文件有效,但我不知道如何在&lt;/dict&gt; 之前执行此操作,我只想在找不到&lt;key&gt;WhitelistedBlockedPlugins&lt;/key&gt; 和相应的数组时这样做。有人有任何指导或解决方案吗?谢谢

【问题讨论】:

在 bash 中(在 linux 中)进行简单替换(主要是在一行中)我会使用 sed (sed = (S)tream (ED)itor) 但你的例子在我看来更复杂所以我会使用python 脚本(或其他语言)。 【参考方案1】:

我解决了同样的问题,但能够使用默认值来修改 com.apple.Safari.plist。

#!/bin/sh

# Get today's date
TODAY=$(/bin/date "+%FT%TZ")

# Determine OS version
osvers=$(sw_vers -productVersion | awk -F. 'print $2')

# Server1's address
SERVER1=server1.name.here

# Server2's address
SERVER2=server2.name.here

# Get Java plug-in info
JAVA_PLUGIN=`/usr/bin/defaults read "/Library/Internet Plug-Ins/JavaAppletPlugin.plugin/Contents/Info" CFBundleIdentifier`

# Check com.apple.Safari.plist for Server1 address
SERVER1_WHITELIST_CHECK=`/usr/bin/defaults read $HOME/Library/Preferences/com.apple.Safari WhitelistedBlockedPlugins | grep PluginHostname | awk 'print $3' | grep $SERVER1 | tr -d '";'`

# Check com.apple.Safari.plist for Server2 address
SERVER2_WHITELIST_CHECK=`/usr/bin/defaults read $HOME/Library/Preferences/com.apple.Safari WhitelistedBlockedPlugins | grep PluginHostname | awk 'print $3' | grep $SERVER2 | tr -d '";'`

if [[ $osvers -ge 6 ]]; then
  if [[ -n $SERVER1_WHITELIST_CHECK ]]; then

        # Server1 settings are present
    /usr/bin/logger "$SERVER1_WHITELIST_CHECK is part of the Java whitelist in Safari. Nothing to do here."
    else        
    # Add Server1 to Java whitelist
        /usr/bin/defaults write $HOME/Library/Preferences/com.apple.Safari "WhitelistedBlockedPlugins" -array-add '"PluginHostname" = "'$SERVER1'"; "PluginIdentifier" = "'$JAVA_PLUGIN'"; "PluginLastVisitedDate" = "'$TODAY'"; "PluginName" = "Java Applet Plug-in"; "PluginPageURL" = "https://'$SERVER1'"; "PluginPolicy" = "PluginPolicyNeverBlock";'
        /usr/bin/logger "$SERVER1 has been added to the Java whitelist in Safari."
  fi

  if [[ -n $SERVER2_WHITELIST_CHECK ]]; then

    # Server2 settings are present
    /usr/bin/logger "$SERVER2_WHITELIST_CHECK is part of the Java whitelist in Safari. Nothing to do here."
     else       
        # Add Server2 to Java whitelist
    /usr/bin/defaults write $HOME/Library/Preferences/com.apple.Safari "WhitelistedBlockedPlugins" -array-add '"PluginHostname" = "'$SERVER2'"; "PluginIdentifier" = "'$JAVA_PLUGIN'"; "PluginLastVisitedDate" = "'$TODAY'"; "PluginName" = "Java Applet Plug-in"; "PluginPageURL" = "https://'$SERVER2'"; "PluginPolicy" = "PluginPolicyNeverBlock";'
        /usr/bin/logger "$SERVER2 has been added to the Java whitelist in Safari."
  fi

fi

exit 0

The code's also available here on my GitHub repo.

【讨论】:

感谢分享,您的方法绝对是首选!有趣的是,我过去仔细阅读了你的 github,实际上最近与位于多伦多的一位同事交谈,他说他在某个会议上遇到了你。伟大的工作,感谢您过去为我提供的所有帮助,我相信在未来。 :D safari 6.1 的 com.apple.Safari.plist 有一个名为 ManagedPlugInPolicies 的键。这与 WhitelistedBlockedPlugins 不同。【参考方案2】:

您可能只使用默认值:

defaults write ./file.plist WhitelistedBlockedPlugins -array '&lt;dict&gt;&lt;key&gt;a&lt;/key&gt;&lt;string&gt;b&lt;/string&gt;&lt;/dict&gt;'

【讨论】:

感谢您的提示,但编写默认值无法处理我试图实现的复杂性,或者我当然无法弄清楚。【参考方案3】:

因为这是一个修改 plist 文件并使用 OSX 进行修改的案例,所以我发现使用 Plistbuddy 是我最简单的解决方案。如果我需要查找和替换、保留某些站点或在某些条件下添加,我肯定会最终使用 Perl 或 Python……但我有幸清除整个数组并写入我想要的。

下面是我的解决方案,我可能最终会在 LaunchDaemon 或 Agent 中创建它,因此每个用户和每次启动时都会发生这种情况(清除未经授权或批准的 Java 小程序并确保添加我们需要的站点)。

#!/bin/bash

# Convert the com.apple.Safari.plist from binary plist to readable text file
plutil -convert xml1 -o - ~/Library/Preferences/com.apple.Safari.plist > /tmp/com.apple.Safari.plist

# Deletes the WhitelistedBlockedPlugins Key and corresponding array, if it exists
/usr/libexec/PlistBuddy -c "Delete WhitelistedBlockedPlugins" /tmp/com.apple.Safari.plist

# Adds the WhitelistedBlockedPlugins Key and array including two whitelisted sites
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins array" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:0 dict" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:0:PluginHostname string 'www.java.com'" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:0:PluginIdentifier string 'com.oracle.java.JavaAppletPlugin'" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:0:PluginLastVisitedDate date 'Wed Jul 10 12:00:00 PST 2013'" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:0:PluginName string 'Java Applet Plug-in'" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:0:PluginPageURL string 'http://www.java.com/en/download/testjava.jsp'" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:0:PluginPolicy string 'PluginPolicyNeverBlock'" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:1 dict" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:1:PluginHostname string 'another.siteexample.com'" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:1:PluginIdentifier string 'com.oracle.java.JavaAppletPlugin'" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:1:PluginLastVisitedDate date 'Wed Jul 10 12:05:00 PST 2013'" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:1:PluginName string 'Java Applet Plug-in'" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:1:PluginPageURL string 'http://another.siteexample.com/some/path'" /tmp/com.apple.Safari.plist
/usr/libexec/PlistBuddy -c "Add :WhitelistedBlockedPlugins:1:PluginPolicy string 'PluginPolicyNeverBlock'" /tmp/com.apple.Safari.plist

# copy the modified plist back where Safari will then use it and convert it back to binary plist itself
cp /tmp/com.apple.Safari.plist ~/Library/Preferences/com.apple.Safari.plist

同样,作为参考,这是一种将已批准站点列表自动添加到 Safari 的方法。在看到需要更轻松地在客户端计算机上添加我们批准的站点并阅读 http://nakedsecurity.sophos.com/2013/04/18/apple-updates-safari-gives-better-control-over-java-applets/

后,我受到启发这样做

【讨论】:

以上是关于Bash - 在 plist 文本文件中修改 WhitelistedBlockedPlugins的主要内容,如果未能解决你的问题,请参考以下文章

以 $HOME 开头的 plist 中存储的路径不会在 bash 脚本命令中扩展

Linux Bash - 修改从标准输出中提取的文本

使用终端或 bash 脚本创建和写入 .plist

如何实现用bash批量修改文件名

在文档目录中找不到 plist 文件?如何以编程方式修改 plist?

关于macbook里info.plist文件无法修改怎么办?