Publicat pe Lasă un comentariu

defaults – the Plist Killer

săptămâna trecută, colegul Macadmin Kyle Crawford a descoperit că pe macOS High Sierra defaults va șterge un fișier de listă de proprietăți cu sintaxă plist/XML nevalidă, chiar și atunci când încercați doar să citiți date. Erik Holtham are un bug OpenRadar mai detaliat.

Patrik Wardle a găsit codul relevant, care șterge fișierul atunci când nu se validează.

acest lucru este rău. Mulțumesc tuturor celor implicați pentru găsirea, documentarea și împărtășirea acestui lucru.

acesta este un comportament nou în High Sierra. Nu sunt încă sigur ce versiune a High Sierra acest nou comportament a fost introdus. Comportamentul are sens în contextul unei aplicații care încearcă să citească un fișier de setări, dar instrumentul defaults ștergerea fișierelor arbitrare este, desigur, periculos.

Actualizare: acest comportament a fost stabilit în 10.13.4. Cu toate acestea, este încă o bună practică să evitați defaults pentru orice altceva decât fișierele de preferințe reale.

ce să fac?

ca de obicei, nu intrați în panică. Acest lucru va afecta doar Mac-urile care rulează High Sierra și fișierele corupte sau rupte. Cu toate acestea, dacă aveți un script care indică accidental comanda defaults la un alt fișier, acesta va șterge acest lucru. Deci, trebuie să-l utilizați cu grijă.

este probabil o bună practică să verificați un fișier înainte de a încerca să îl modificați cu comanda defaults într-un script cu comanda plutil :

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

alternative la valorile implicite

alternativ, puteți și ar trebui să utilizați plutil sau PlistBuddy pentru a citi și modifica fișierele listei de proprietăți.

Aflați mai multe despre plutil, PlistBuddy și alte instrumente pentru a citi și scrie liste de proprietăți în cartea mea: „Liste de proprietăți, preferințe și profiluri pentru administratorii Apple”

plutil din păcate, nu este foarte util să citiți o singură valoare dintr-un fișier listă de proprietăți. Verbul extract va arăta orice valoare ca plist propriu. Comanda plutil este utilă pentru a edita fișierele plist existente. (Citiți detalii despre comanda plutil.)

PlistBuddy, cu toate acestea, este foarte util atât pentru citirea unei valori de scriere într-un fișier listă de proprietăți:

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

PlistBuddy are avantajul suplimentar de a permite adăugarea sau editarea valorilor imbricate adânc în dict sau array structuri.

puteți obține mai multe informații despre PlistBuddy în pagina sa de manual sau în cartea mea.

modul interactiv al PlistBuddy este, de asemenea, foarte util.

deci comanda defaults este moartă?

nr.

Apple ne-a avertizat să nu folosim defaults pentru editarea și analizarea fișierelor listei de proprietăți generice de ceva timp în pagina man a comenzii defaults :

avertisment: comanda defaults va fi modificată într-o versiune majoră viitoare pentru a funcționa numai pe domenii preferințe. Utilitățile generale de manipulare plist vor fi pliate într-un alt program de linie de comandă.

după cum afirmă acest avertisment, instrumentul defaults citește și scrie date în fișiere plist prin sistemul de preferințe macOS. Acest lucru are avantajul că instrumentul primește (și modifică) valoarea curentă, indiferent dacă este memorată în memorie sau nu. Atunci când o aplicație este de ascultare pentru notificări că o preferință sa schimbat (nu mulți fac), atunci acesta va fi notificat.

fișierele pentru domeniile preferențiale sunt de obicei stocate în /Library/Preferences/, ~/Library/Preferences sau subfolderele lor ByHost. Aplicațiile Sandboxed vor avea fișierele plist preferate în containerul lor.

există, totuși, multe alte fișiere care sunt fișiere de listă de proprietăți care nu fac parte din Sistemul implicit al utilizatorului: launchd fișiere, profiluri de configurare și rețete AutoPkg pentru a numi doar câteva.

administratorii Mac folosesc în mod obișnuit instrumentul defaults, în ciuda avertismentului Apple, pentru a crea, citi și edita fișiere plist generice. Așa cum am menționat mai sus, plutil, PlistBuddy sau manipularea directă prin Obj-C, Python sau Swift, sunt alegeri mai bune pentru fișierele plist generice.

Lasă un răspuns

Adresa ta de email nu va fi publicată.