Publicado el Deja un comentario

predeterminados-el asesino de listas de códigos

La semana pasada, el MacAdmin Kyle Crawford descubrió que en macOS High Sierra el defaults eliminará un archivo de lista de propiedades con sintaxis plist/XML no válida, incluso cuando solo intente leer datos. Erik Holtham tiene un error de OpenRadar más detallado.

Patrik Wardle ha encontrado el código relevante, que elimina el archivo cuando no se valida.

Esto es malo. Gracias a todos los involucrados por encontrar, documentar y compartir esto.

Este es un nuevo comportamiento en High Sierra. Todavía no estoy seguro de qué versión de High Sierra se introdujo este nuevo comportamiento. El comportamiento tiene sentido en el contexto de una aplicación que intenta leer un archivo de configuración, pero la herramienta defaults eliminar archivos arbitrarios es, por supuesto, peligrosa.

Actualización: Este comportamiento se ha corregido en 10.13.4. Sin embargo, sigue siendo una buena práctica evitar defaults para cualquier cosa que no sea archivos de preferencias reales.

¿Qué hacer?

Como de costumbre, no se asuste. Esto solo afectará a los Mac que ejecuten High Sierra y a los archivos dañados o rotos. Sin embargo, si tiene un script que apunta accidentalmente el comando defaults a un archivo diferente, lo eliminará. Así que tienes que usarlo con cuidado.

Probablemente sea una buena práctica verificar un archivo antes de intentar modificarlo con el comando defaults en un script con el comando plutil :

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

Alternativas a los valores predeterminados

Alternativamente, puede y debe usar plutil o PlistBuddy para leer y modificar archivos de lista de propiedades.

Más información sobre plutil, PlistBuddy y otras herramientas para leer y escribir listas de propiedades en mi libro: «Listas de Propiedades, Preferencias y Perfiles para Administradores de Apple»

plutil desafortunadamente, no es realmente útil leer un solo valor de un archivo de lista de propiedades. El verbo extract mostrará cualquier valor como su propia plist. El comando plutil es útil para editar archivos plist existentes. (Lea los detalles en el comando plutil.)

PlistBuddy, sin embargo, es muy útil tanto para leer valores de escritura en un archivo de lista de propiedades:

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

PlistBuddy tiene la ventaja adicional de permitir agregar o editar valores anidados profundamente en estructuras dict o array.

Puede obtener más información sobre PlistBuddy en su página de manual o en mi libro.

El modo interactivo de PlistBuddy también es muy útil.

¿Así que el comando predeterminado está muerto?

No.

Apple nos ha estado advirtiendo de no usar defaults para editar y analizar archivos de lista de propiedades genéricas durante bastante tiempo en la página de manual del comando defaults :

ADVERTENCIA: El comando defaults se cambiará en una próxima versión principal para que solo funcione en dominios de preferencias. Las utilidades generales de manipulación de plist se plegarán en un programa de línea de comandos diferente.

Como indica esta advertencia, la herramienta defaults lee y escribe datos en archivos plist a través del sistema de preferencias de macOS. Esto tiene la ventaja de que la herramienta obtiene (y cambia) el valor actual, ya sea que esté almacenado en caché en memoria o no. Cuando una aplicación está escuchando notificaciones de que una preferencia ha cambiado (no muchas lo hacen), se le notificará.

Los archivos para dominios de preferencias se almacenan generalmente en subcarpetas /Library/Preferences/, ~/Library/Preferences o en sus subcarpetas ByHost. Las aplicaciones de espacio aislado tendrán sus archivos plist de preferencia en su contenedor.

Sin embargo, hay muchos otros archivos que son archivos de lista de propiedades que no forman parte del sistema predeterminado del usuario: launchd archivos, perfiles de configuración y recetas de AutoPkg, por nombrar solo algunos.

Los administradores de Mac suelen usar la herramienta defaults, a pesar de la advertencia de Apple, para crear, leer y editar archivos plist genéricos. Como se mencionó anteriormente, plutil, PlistBuddy o la manipulación directa a través de Obj-C, Python o Swift, son mejores opciones para archivos plist genéricos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada.