Geplaatst op Geef een reactie

defaults-the Plist Killer

vorige week heeft collega Macadmin Kyle Crawford ontdekt dat op macOS High Sierra de defaults een eigenschappenlijstbestand met ongeldige plist/XML-syntaxis zal verwijderen, zelfs wanneer u gewoon probeert gegevens te lezen. Erik Holtham heeft een meer gedetailleerde openradar bug.

Patrik Wardle heeft de relevante code gevonden, die het bestand verwijdert wanneer het niet valideert.

dit is onjuist. Dank aan alle betrokkenen voor het vinden, documenteren en delen van dit.

dit is nieuw gedrag in High Sierra. Ik weet nog niet zeker welke versie van High Sierra dit nieuwe gedrag werd geïntroduceerd. Het gedrag is zinvol in de context van een toepassing die probeert een instellingenbestand te lezen, maar het defaults – gereedschap dat willekeurige bestanden verwijdert, is natuurlijk gevaarlijk.

Update: dit gedrag is vastgesteld in 10.13.4. Het is echter nog steeds een goede praktijk om defaults te vermijden voor iets anders dan werkelijke voorkeurenbestanden.

wat te doen?

zoals gewoonlijk, geen paniek. Dit heeft alleen invloed op Macs met High Sierra en corrupte of gebroken bestanden. Als u echter een script hebt dat per ongeluk het defaults commando naar een ander bestand wijst, zal het dat verwijderen. Dus je moet het voorzichtig gebruiken.

het is waarschijnlijk een goede gewoonte om een bestand te verifiëren voordat u het probeert te wijzigen met het defaults commando in een script met het plutil Commando:

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

alternatieven voor standaardinstellingen

u kunt en moet ook plutil of PlistBuddy gebruiken om eigenschappenlijstbestanden te lezen en te wijzigen.

meer informatie over plutil, PlistBuddy en andere hulpmiddelen om eigenschapslijsten in mijn boek te lezen en te schrijven: “Property lijsten, voorkeuren en profielen voor Apple beheerders”

plutil is helaas niet echt nuttig om een enkele waarde uit een eigenschappenlijst bestand te lezen. Het extract werkwoord toont elke waarde als zijn eigen plist. Het plutil commando is handig om bestaande plist bestanden te bewerken. (Lees details op het plutil Commando.)

PlistBuddy, het is echter erg handig voor zowel het lezen van een schrijfwaarde naar een eigenschappenlijstbestand:

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

PlistBuddy heeft het extra voordeel dat het mogelijk is om waarden toe te voegen of te bewerken die diep zijn genest in dict of array structuren.

u kunt meer informatie over PlistBuddy vinden in de manpage of mijn boek.

de interactieve modus van PlistBuddy is ook zeer nuttig.

dus het commando standaardwaarden is dood?

No.

Apple heeft ons al een tijdje gewaarschuwd om defaults niet te gebruiken voor het bewerken en ontleden van algemene eigenschappenlijsten in de manpage van het defaults Commando:

waarschuwing: de defaults commando zal worden gewijzigd in een komende grote release om alleen te werken op Voorkeuren domeinen. Algemene plist manipulatie utilities zal worden gevouwen in een ander command-line programma.

zoals deze waarschuwing aangeeft, leest en schrijft het hulpprogramma defaults gegevens naar plist-bestanden via het voorkeurensysteem van macOS. Dit heeft het voordeel dat het gereedschap de huidige waarde krijgt (en wijzigt), of het nu in het geheugen is opgeslagen of niet. Wanneer een toepassing luistert naar meldingen dat een voorkeur is veranderd (niet veel doen) dan zal het worden aangemeld.

bestanden voor voorkeursdomeinen worden gewoonlijk opgeslagen in /Library/Preferences/, ~/Library/Preferences of hun ByHost submappen. Sandboxed applicaties hebben hun voorkeur plist bestanden in hun container.

er zijn echter veel andere bestanden die eigenschappenlijstbestanden zijn die geen deel uitmaken van het user defaults system: launchd bestanden, configuratieprofielen en AutoPkg` recepten om er maar een paar te noemen.

Mac-beheerders gebruiken vaak het defaults – Gereedschap, ondanks de waarschuwing van Apple, om generieke plist-bestanden te maken, te lezen en te bewerken. Zoals hierboven vermeld, zijn plutil, PlistBuddy of directe manipulatie via Obj – C, Python of Swift betere keuzes voor generieke plist-bestanden.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd.