Publicado em Deixe um comentário

defaults-the Plist Killer

na semana passada, o colega Macadmin Kyle Crawford descobriu que no macOS High Sierra o defaults excluirá um arquivo de Lista de propriedades com sintaxe plist/XML inválida, mesmo quando você apenas tenta ler dados. Erik Holtham tem um bug OpenRadar mais detalhado.

Patrik Wardle encontrou o código relevante, que exclui o arquivo quando ele não valida.

isso é ruim. Obrigado a todos os envolvidos por encontrar, documentar e compartilhar isso.

este é um novo comportamento em High Sierra. Ainda não tenho certeza de qual versão do High Sierra esse novo comportamento foi introduzido. O comportamento faz sentido no contexto de um aplicativo tentando ler um arquivo de configurações, mas a ferramenta defaults excluindo arquivos arbitrários é, é claro, perigosa.

Update: este comportamento foi corrigido em 10.13.4. No entanto, ainda é uma boa prática evitar defaults para qualquer coisa que não seja Arquivos de preferências reais.

o que fazer?

como de costume, não entre em pânico. Isso afetará apenas os Macs que executam o High Sierra e arquivos corrompidos ou quebrados. No entanto, se você tiver um script que acidentalmente aponta o comando defaults para um arquivo diferente, ele excluirá isso. Então você tem que usá-lo com cuidado.

provavelmente é uma boa prática para verificar um arquivo antes de tentar modificá-lo com o defaults comando em um script com o plutil comando:

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

Alternativas para os padrões

Alternativamente, você pode e deve usar plutil ou PlistBuddy para ler e modificar propriedades da lista de ficheiros.

Saiba mais sobre plutil, PlistBuddy e outras ferramentas para ler e escrever listas de propriedades em meu livro: “Listas de propriedades, preferências e perfis para administradores da Apple”

plutil infelizmente, não é realmente útil ler um único valor de um arquivo de Lista de propriedades. O verbo extract mostrará qualquer valor como seu próprio plist. O comando plutil é útil para editar arquivos plist existentes. (Leia detalhes sobre o comando plutil.)

PlistBuddy, no entanto, é muito útil tanto para a leitura de uma escrita de valores para uma propriedade de arquivo de lista de:

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

PlistBuddy tem a vantagem adicional de permitir adicionar ou editar valores aninhadas profunda em dict ou array estruturas.

você pode obter mais informações sobre PlistBuddy em sua página de manual ou meu livro.

o modo interativo de PlistBuddy também é muito útil.

então o comando defaults está morto?

não.

a Apple tem nos avisado para não usar defaults para edição e análise de arquivos de Lista de propriedades genéricas por um bom tempo na página de manual do comando defaults :

aviso: o comando defaults será alterado em uma próxima versão principal para operar apenas em domínios de preferências. Os utilitários gerais de manipulação de plist serão dobrados em um programa de linha de comando diferente.

como este aviso indica, a ferramenta defaults lê e grava dados em arquivos plist através do sistema de preferências do macOS. Isso tem a vantagem de que a ferramenta obtém (e altera) o valor atual, seja ele armazenado em cache na memória ou não. Quando um aplicativo está ouvindo notificações de que uma preferência mudou (muitos não o fazem), ele será notificado.

os arquivos para domínios de preferência são geralmente armazenados em /Library/Preferences/, ~/Library/Preferences ou suas subpastas ByHost. Os aplicativos em sandbox terão seus arquivos plist de preferência em seu contêiner.

no entanto, existem muitos outros arquivos que são Arquivos de Lista de propriedades que não fazem parte do sistema de padrões do Usuário: launchd arquivos, perfis de configuração e receitas do AutoPkg para citar apenas alguns.

os administradores do Mac costumam usar a ferramenta defaults, apesar do aviso da Apple, para criar, ler e editar arquivos plist genéricos. Como mencionado acima, plutil, PlistBuddy ou manipulação direta por meio de Obj-C, Python ou Swift, são melhores opções para arquivos plist genéricos.

Deixe uma resposta

O seu endereço de email não será publicado.