Pubblicato il Lascia un commento

defaults-the Plist Killer

La scorsa settimana, il collega MacAdmin Kyle Crawford ha scoperto che su macOS High Sierra il defaults eliminerà un file di elenco di proprietà con sintassi plist/XML non valida, anche quando si tenta di leggere i dati. Erik Holtham ha un bug OpenRadar più dettagliato.

Patrik Wardle ha trovato il codice pertinente, che elimina il file quando non viene convalidato.

Questo è male. Grazie a tutti i soggetti coinvolti per la ricerca, la documentazione e la condivisione di questo.

Questo è un nuovo comportamento in High Sierra. Non sono ancora sicuro di quale versione di High Sierra sia stato introdotto questo nuovo comportamento. Il comportamento ha senso nel contesto di un’applicazione che tenta di leggere un file di impostazioni, ma lo strumento defaults che elimina file arbitrari è, ovviamente, pericoloso.

Aggiornamento: Questo comportamento è stato corretto in 10.13.4. Tuttavia, è ancora buona pratica evitare defaults per qualcosa di diverso dai file delle preferenze effettive.

Cosa fare?

Come al solito, niente panico. Questo interesserà solo i Mac che eseguono High Sierra e file corrotti o rotti. Tuttavia, se si dispone di uno script che punta accidentalmente il comando defaults su un file diverso, lo eliminerà. Quindi devi usarlo con cura.

È probabilmente una buona pratica verificare un file prima di tentare di modificarlo con il comando defaults in uno script con il comando plutil :

if ! plutil -lint path/to/file.plist; then echo "broken plist" exit 1else defaults path/to/file …fi

Alternative ai valori predefiniti

In alternativa, è possibile e necessario utilizzare plutil o PlistBuddy per leggere e modificare i file dell’elenco delle proprietà.

Ulteriori informazioni su plutil, PlistBuddy e altri strumenti per leggere e scrivere elenchi di proprietà nel mio libro: “Elenchi di proprietà, preferenze e profili per gli amministratori Apple”

plutil sfortunatamente non è molto utile leggere un singolo valore da un file di elenco di proprietà. Il verbo extract mostrerà qualsiasi valore come proprio plist. Il comando plutil è utile per modificare i file plist esistenti. (Leggi i dettagli sul comando plutil.)

PlistBuddy, tuttavia è molto utile sia per la lettura di un valore di scrittura in un file di elenco di proprietà:

$ /usr/libexec/PlistBuddy berry.plist -c "print size"$ /usr/libexec/PlistBuddy berry.plist -c "set size enormous"

PlistBuddy ha l’ulteriore vantaggio di consentire di aggiungere o modificare valori nidificati in profondità in strutture dict o array.

Puoi ottenere maggiori informazioni su PlistBuddy nella sua pagina man o nel mio libro.

La modalità interattiva di PlistBuddy è anche molto utile.

Quindi il comando defaults è morto?

N.

Apple ci ha avvertito di non usare defaults per la modifica e l’analisi dei file di elenco delle proprietà generiche per un po ‘ di tempo nella pagina man del comando defaults :

ATTENZIONE: il comando defaults verrà modificato in una prossima versione principale per operare solo sui domini delle preferenze. Le utilità generali di manipolazione plist verranno piegate in un diverso programma da riga di comando.

Come indica questo avviso, lo strumento defaults legge e scrive i dati sui file plist tramite il sistema preferenze di macOS. Questo ha il vantaggio che lo strumento ottiene (e cambia) il valore corrente se è memorizzato nella cache o meno. Quando un’applicazione è in ascolto per le notifiche che una preferenza è cambiata (non molti lo fanno) allora verrà notificato.

I file per i domini delle preferenze vengono solitamente archiviati in /Library/Preferences/, ~/Library/Preferences o nelle loro sottocartelle ByHost. Le applicazioni sandbox avranno i loro file plist di preferenza nel loro contenitore.

Ci sono, tuttavia, molti altri file che sono file di elenco delle proprietà che non fanno parte del sistema di default dell’utente: launchd file, profili di configurazione e ricette AutoPkg per citarne solo alcuni.

Gli amministratori Mac utilizzano comunemente lo strumento defaults, nonostante l’avvertimento di Apple, per creare, leggere e modificare file plist generici. Come accennato in precedenza, plutil, PlistBuddy o manipolazione diretta tramite Obj-C, Python o Swift, sono scelte migliori per i file plist generici.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.