Publié le Laisser un commentaire

defaults – the Plist Killer

La semaine dernière, son collègue MacAdmin Kyle Crawford a découvert que sur macOS High Sierra, le defaults supprimera un fichier de liste de propriétés avec une syntaxe plist / XML invalide, même lorsque vous essayez simplement de lire des données. Erik Holtham a un bug OpenRadar plus détaillé.

Patrik Wardle a trouvé le code pertinent, qui supprime le fichier lorsqu’il n’est pas validé.

C’est mauvais. Merci à toutes les personnes impliquées pour avoir trouvé, documenté et partagé cela.

C’est un nouveau comportement dans High Sierra. Je ne sais pas encore quelle version de High Sierra ce nouveau comportement a été introduit. Le comportement est logique dans le contexte d’une application qui tente de lire un fichier de paramètres, mais l’outil defaults qui supprime des fichiers arbitraires est bien sûr dangereux.

Mise à jour : Ce comportement a été corrigé dans 10.13.4. Cependant, il est toujours de bonne pratique d’éviter defaults pour autre chose que les fichiers de préférences réels.

Que faire ?

Comme d’habitude, pas de panique. Cela n’affectera que les Mac exécutant High Sierra et les fichiers corrompus ou cassés. Cependant, si vous avez un script qui pointe accidentellement la commande defaults sur un fichier différent, il le supprimera. Vous devez donc l’utiliser avec soin.

C’est probablement une bonne pratique de vérifier un fichier avant de tenter de le modifier avec la commande defaults dans un script avec la commande plutil:

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

Alternatives aux valeurs par défaut

Alternativement, vous pouvez et devez utiliser plutil ou PlistBuddy pour lire et modifier les fichiers de liste de propriétés.

En savoir plus sur plutil, PlistBuddy et d’autres outils pour lire et écrire des listes de propriétés dans mon livre:  » Listes de propriétés, Préférences et Profils pour les administrateurs Apple »

plutil n’est malheureusement pas vraiment utile pour lire une seule valeur à partir d’un fichier de liste de propriétés. Le verbe extract affichera n’importe quelle valeur comme sa propre liste. La commande plutil est utile pour éditer des fichiers plist existants. (Lisez les détails de la commande plutil.)

PlistBuddy, cependant, il est très utile à la fois pour lire une valeur d’écriture dans un fichier de liste de propriétés:

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

PlistBuddy a l’avantage supplémentaire de permettre d’ajouter ou de modifier des valeurs imbriquées profondément dans des structures dict ou array.

Vous pouvez obtenir plus d’informations sur PlistBuddy dans sa page de manuel ou dans mon livre.

Le mode interactif de PlistBuddy est également très utile.

Donc la commande par défaut est morte ?

Non.

Apple nous avertit de ne pas utiliser defaults pour l’édition et l’analyse de fichiers de liste de propriétés génériques depuis un bon moment dans la page de manuel de la commande defaults:

AVERTISSEMENT : La commande defaults sera modifiée dans une prochaine version majeure pour fonctionner uniquement sur les domaines de préférences. Les utilitaires de manipulation générale de plist seront pliés dans un programme de ligne de commande différent.

Comme l’indique cet avertissement, l’outil defaults lit et écrit des données dans des fichiers plist via le système de préférences de macOS. Cela a l’avantage que l’outil obtient (et change) la valeur actuelle, qu’elle soit mise en cache en mémoire ou non. Lorsqu’une application écoute des notifications indiquant qu’une préférence a changé (peu de gens le font), elle sera notifiée.Les fichiers

des domaines de préférence sont généralement stockés dans les sous-dossiers /Library/Preferences/, ~/Library/Preferences ou leurs sous-dossiers ByHost. Les applications en bac à sable auront leurs fichiers de listes de préférences dans leur conteneur.

Il existe cependant de nombreux autres fichiers qui sont des fichiers de liste de propriétés qui ne font pas partie du système de valeurs par défaut de l’utilisateur: launchd fichiers, profils de configuration et recettes d’AutoPkg pour n’en nommer que quelques-uns.

Les administrateurs Mac utilisent couramment l’outil defaults, malgré l’avertissement d’Apple, pour créer, lire et modifier des fichiers plist génériques. Comme mentionné ci-dessus, plutil, PlistBuddy ou une manipulation directe via Obj-C, Python ou Swift, sont de meilleurs choix pour les fichiers plist génériques.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.