2013-07-11 2 views
2

Я пытаюсь автоматизировать добавление белого списка заблокированных приложений и сайтов для Safari в отношении Java. Я могу экспортировать двоичный plist и редактировать его через bash, но я зациклился на том, как искать и заменять или просто добавлять в файл с определенным размещением.Bash - изменение WhitelistedBlockedPlugins в текстовом файле plist

<?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> 

The

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

это немного, я хотел бы найти и заменить или добавить, если он не существует. Если он существует, вполне можно заменить все, начиная с <key>WhitelistedBlockedPlugins</key> и заканчивая закрытием </array>, так как мы все равно хотим контролировать, что там происходит.

Если он не существует, я могу добавить его непосредственно перед окончательным </dict> в конце файла.

Это логика, с которой я столкнулся, но мне очень сложно найти решение, где я могу искать, если найду замену, если не нашел.

Я пробовал несколько вещей без успеха после прочтения подобных сообщений в переполнении стека. Я готов использовать что-то родное для OSX, включая то, что поставляется с инструментами XCode/CLI.

Что я пробовал:

echo в файл работает, но я не выяснить, как сделать это до </dict> и я только хочу, чтобы сделать это, если массив <key>WhitelistedBlockedPlugins</key> и соответствующий является нигде не было найдено. У кого-нибудь есть какие-либо рекомендации или решения? Благодаря

+0

В Баш (в Linux) для простой замены (в основном что-то в одной строке) Я хотел бы использовать 'sed' (SED = (S) Tream (ED) itor), но ваш пример кажется, мне более сложно, поэтому я бы использовал скрипт python (или другой язык). – furas

ответ

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.

+0

Спасибо за обмен, ваш метод будет абсолютно предпочтительным! Это смешно, я раньше изучал ваш github и недавно разговаривал с коллегой, который находился в Торонто, и он сказал, что встретил вас на какой-то конференции. Отличная работа, и спасибо за всю помощь, которую вы мне предоставили в прошлом, и я уверен в будущем. : D – TryTryAgain

+0

В com.apple.Safari.plist для сафари 6.1 есть ключ под названием ManagedPlugInPolicies. Это отличается от WhitelistedBlockedPlugins. – TryTryAgain

0

Вы можете просто использовать по умолчанию:

defaults write ./file.plist WhitelistedBlockedPlugins -array '<dict><key>a</key><string>b</string></dict>'

+0

Спасибо за подсказку, но записи по умолчанию просто не смогли справиться с той сложностью, которую я пытался достичь, или я, конечно, не мог понять это. – TryTryAgain

0

Потому что это был случай модификации 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/

Смежные вопросы