Veröffentlicht am Schreib einen Kommentar

defaults – the Plist Killer

Letzte Woche, Kollegen MacAdmin Kyle Crawford entdeckt, dass auf macOS High Sierra die defaults wird eine Eigenschaftslistendatei mit ungültiger plist / XML-Syntax löschen, auch wenn Sie nur versuchen, Daten zu lesen. Erik Holtham hat einen detaillierteren OpenRadar-Fehler.

Patrik Wardle hat den entsprechenden Code gefunden, der die Datei löscht, wenn sie nicht validiert wird.

Das ist schlecht. Vielen Dank an alle Beteiligten, die dies gefunden, dokumentiert und geteilt haben.

Dies ist ein neues Verhalten in High Sierra. Ich bin mir noch nicht sicher, in welcher Version von High Sierra dieses neue Verhalten eingeführt wurde. Das Verhalten ist im Kontext einer Anwendung sinnvoll, die versucht, eine Einstellungsdatei zu lesen, aber das defaults -Tool, das beliebige Dateien löscht, ist natürlich gefährlich.

Update: Dieses Verhalten wurde in 10.13.4 behoben. Es empfiehlt sich jedoch immer noch, defaults für andere als die tatsächlichen Einstellungsdateien zu vermeiden.

Was ist zu tun?

Wie üblich, keine Panik. Dies betrifft nur Macs mit High Sierra und beschädigten oder defekten Dateien. Wenn Sie jedoch ein Skript haben, das versehentlich den Befehl defaults auf eine andere Datei verweist, wird diese gelöscht. Sie müssen es also mit Vorsicht verwenden.

Es empfiehlt sich wahrscheinlich, eine Datei zu überprüfen, bevor Sie versuchen, sie mit dem Befehl defaults in einem Skript mit dem Befehl plutil zu ändern:

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

Alternativen zu Standardwerten

Alternativ können und sollten Sie plutil oder PlistBuddy verwenden, um Eigenschaftslistendateien zu lesen und zu ändern.

Erfahren Sie mehr über plutil, PlistBuddy und andere Tools zum Lesen und Schreiben von Eigenschaftslisten in meinem Buch: „Eigenschaftslisten, Einstellungen und Profile für Apple Administratoren“

plutil ist leider nicht wirklich sinnvoll, einen einzelnen Wert aus einer Eigenschaftslistendatei zu lesen. Das Verb extract zeigt jeden Wert als eigene Liste an. Der Befehl plutil ist nützlich, um vorhandene Plist-Dateien zu bearbeiten. (Lesen Sie Details zum Befehl plutil.)

PlistBuddy, dies ist jedoch sehr nützlich, um Werte in eine Eigenschaftslistendatei zu lesen und zu schreiben:

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

PlistBuddy hat den zusätzlichen Vorteil, dass Werte hinzugefügt oder bearbeitet werden können, die tief in dict – oder array -Strukturen verschachtelt sind.

Weitere Informationen zu PlistBuddy finden Sie in der Manpage oder in meinem Buch.

Der interaktive Modus von PlistBuddy ist ebenfalls sehr nützlich.

Der Befehl defaults ist also tot?

Nein.

Apple hat uns gewarnt, defaults nicht für die generische Bearbeitung und Analyse von Eigenschaftslistendateien in der Manpage des Befehls defaults zu verwenden:

WARNUNG: Der Befehl defaults wird in einer kommenden Hauptversion so geändert, dass er nur für Einstellungsdomänen ausgeführt wird. Allgemeine plist Manipulation Dienstprogramme werden in ein anderes Befehlszeilenprogramm gefaltet werden.

Wie in dieser Warnung angegeben, liest und schreibt das defaults -Tool Daten über das macOS-Einstellungssystem in Plist-Dateien. Dies hat den Vorteil, dass das Tool den aktuellen Wert erhält (und ändert), unabhängig davon, ob er im Speicher zwischengespeichert ist oder nicht. Wenn eine Anwendung auf Benachrichtigungen wartet, dass sich eine Voreinstellung geändert hat (nicht viele), wird sie benachrichtigt.

Dateien für Präferenzdomänen werden normalerweise in /Library/Preferences/, ~/Library/Preferences oder deren ByHost Unterordnern gespeichert. Sandbox-Anwendungen haben ihre bevorzugten Plist-Dateien in ihrem Container.

Es gibt jedoch viele andere Dateien, die Eigenschaftslistendateien sind, die nicht Teil des Benutzerstandardsystems sind: launchd Dateien, Konfigurationsprofile und AutoPkg-Rezepte, um nur einige zu nennen.

Mac-Administratoren verwenden das defaults -Tool trotz der Warnung von Apple häufig, um generische Plist-Dateien zu erstellen, zu lesen und zu bearbeiten. Wie oben erwähnt, sind plutil , PlistBuddy oder direkte Manipulation durch Obj-C, Python oder Swift die bessere Wahl für generische Plist-Dateien.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.