Opublikowano Dodaj komentarz

defaults-The Plist Killer

w zeszłym tygodniu MacAdmin Kyle Crawford odkrył, że na macOS High Sierra defaults usunie plik listy właściwości z nieprawidłową składnią plist / XML, nawet jeśli po prostu próbujesz odczytać dane. Erik Holtham ma bardziej szczegółowy błąd OpenRadar.

Patrik Wardle znalazł odpowiedni kod, który usuwa plik, gdy nie sprawdza się.

to jest złe. Dziękujemy wszystkim zaangażowanym za znalezienie, dokumentowanie i dzielenie się tym.

to nowe zachowanie w High Sierra. Nie jestem jeszcze pewien, która wersja High Sierra to nowe zachowanie zostało wprowadzone. Zachowanie to ma sens w kontekście aplikacji próbującej odczytać plik ustawień, ale narzędzie defaults usuwanie dowolnych plików jest oczywiście niebezpieczne.

Aktualizacja: to zachowanie zostało poprawione w wersji 10.13.4. Jednak nadal dobrą praktyką jest unikanie defaults dla czegokolwiek innego niż rzeczywiste pliki preferencji.

co robić?

jak zwykle nie panikuj. Wpłynie to tylko na komputery Mac z systemem High Sierra i uszkodzone lub uszkodzone pliki. Jeśli jednak masz skrypt, który przypadkowo wskazuje polecenie defaults na inny plik, spowoduje to jego usunięcie. Więc musisz go używać ostrożnie.

prawdopodobnie dobrą praktyką jest sprawdzanie pliku przed próbą jego modyfikacji za pomocą polecenia defaults w skrypcie za pomocą polecenia plutil :

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

alternatywy dla domyślnych

Alternatywnie, możesz i powinieneś użyć plutil lub PlistBuddy do odczytu i modyfikacji plików listy właściwości.

dowiedz się więcej o plutil, PlistBuddy i innych narzędziach do czytania i pisania list nieruchomości w mojej książce: „Listy właściwości, preferencje i profile dla administratorów Apple”

plutil niestety nie jest bardzo przydatne, aby odczytać pojedynczą wartość z pliku listy właściwości. Czasownik extract pokaże dowolną wartość jako własny plist. Polecenie plutil jest przydatne do edycji istniejących plików plist. (Przeczytaj szczegóły polecenia plutil.)

PlistBuddy, jest jednak bardzo przydatne zarówno do odczytu zapisanych wartości do pliku listy właściwości:

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

PlistBuddy dodatkową zaletą jest możliwość dodawania lub edycji wartości zagnieżdżonych głęboko w strukturach dict lub array.

więcej informacji na temat PlistBuddy można uzyskać na stronie podręcznika lub w mojej książce.

tryb interaktywny PlistBuddy jest również bardzo przydatny.

czyli polecenie domyślne nie działa?

Nie

Apple ostrzega nas, aby nie używać defaults do edycji i parsowania plików listy właściwości ogólnych na stronie podręcznika poleceń defaults :

Ostrzeżenie: polecenie domyślne zostanie zmienione w nadchodzącym wydaniu głównym, aby działało tylko w domenach preferencji. Ogólne narzędzia do manipulacji plist zostaną złożone w inny program wiersza poleceń.

zgodnie z tym ostrzeżeniem narzędzie defaults odczytuje i zapisuje dane do plików plist za pośrednictwem systemu preferencji systemu macOS. Ma to tę zaletę, że narzędzie pobiera (i zmienia) bieżącą wartość, niezależnie od tego, czy jest ona buforowana w pamięci, czy nie. Gdy aplikacja nasłuchuje powiadomień o zmianie preferencji (niewielu tak robi), zostanie powiadomiona.

Pliki dla domen preferencji są zwykle przechowywane w /Library/Preferences/, ~/Library/Preferences lub ich podfolderach ByHost. Aplikacje w piaskownicy będą miały swoje preferowane pliki plist w kontenerze.

istnieje jednak wiele innych plików, które są plikami listy właściwości, które nie są częścią systemu domyślnego użytkownika: launchd pliki, profile konfiguracji i receptury AutoPkg, aby wymienić tylko kilka.

Administratorzy komputerów Mac często używają narzędzia defaults, pomimo ostrzeżeń Apple, do tworzenia, odczytywania i edycji ogólnych plików plist. Jak wspomniano powyżej, plutil, PlistBuddy lub bezpośrednia manipulacja za pomocą Obj-C, Python lub Swift, są lepszym wyborem dla ogólnych plików plist.

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.