Use mdfind para identificar todos os dmg criptografados?


5

Alguém pode sugerir uma maneira inteligente de identificar todos os dmg que são criptografados?

Minha única ideia é bastante complicada. usar mdfind '(kMDItemFSName=*.dmg)' e depois testar a resposta de hdiutil imageinfo e registre o resultado daqueles que pedem uma senha. Graças à resposta e aos comentários, o comando a seguir executa todo o dmg por meio do hdiutil, mas não consigo descobrir como identificar os que fornecem um erro. Alguma ideia?

mdfind -0 "kMDItemFSName=*.dmg" |xargs -0 -I{} -L 1 hdiutil imageinfo {}

1
AFAIK Não há um atributo de arquivo estendido para criptografado .dmg arquivos, por exemplo usando ls -l@ pode mostrar com.apple.metadata:kMDItemDownloadedDate não há com.apple.metadata:kMDItemEncrypted. Você pode ver o atributos de metadados de um arquivo usando mdls. Então usando hdiutil imageinfo é provavelmente a única maneira de obter diretamente do próprio arquivo. Você pode fazer o script e canalizar a saída de hdiutil imageinfo para grep, etc. e processá-lo ainda mais para que a saída final seja uma lista de arquivos criptografados, etc. Tudo depende realmente do que você está tentando realizar para começar.
— user3439894

Oi. Eu só quero saber quais dmg são criptografados. Para fazer uma lista.
— jakethedog

Respostas:


1

No presente momento no meu disco local eu tenho 88 .dmg arquivos, três dos quais são criptografados. Antes de executar a linha de comando abaixo, eu não sabia quantos criptografados .dmg arquivos que eu tinha e se algum, onde eles estavam. Portanto, embora a linha de comando a seguir possa parecer complicada, ela deve funcionar como anunciada.

Abrir terminal e copie e cole toda a linha de comando abaixo, como está, no terminal então aperte Entrar .

mdfind '(kMDItemFSName=*.dmg)' | while IFS= read -r line; do printf "$line " & hdiutil isencrypted "$line"; done > dmg_file_list; grep ': YES' dmg_file_list > encrypted_dmg_file_list; clear; cat encrypted_dmg_file_list

Isto irá criar dois arquivos, dmg_file_list e encrypted_dmg_file_list e emita o conteúdo deste último para o Terminal. Os arquivos também podem ser abertos em um editor de texto.

Os arquivos conterão nome de caminho totalmente qualificado do .dmg arquivos seguidos por um espaço e criptografado: NÃO ou criptografado: SIM no dmg_file_list arquivo e apenas o nome de caminho totalmente qualificado do .dmg arquivos seguidos por um espaço e criptografado: SIM no encrypted_dmg_file_list Arquivo.

Você pode então excluir manualmente os dois arquivos criados pelo comando quando terminar com eles.

Nota: Uma vez que a linha de comando é executada, pode demorar um pouco para processar e produzir o conteúdo do arquivo. encrypted_dmg_file_list arquivo para o Terminal. Dependerá de quantas .dmg arquivos existem.

Aqui está a linha de comando completa mostrada com continuação de linha, portanto, certifique-se de copiar e colar toda a linha. (Você pode realmente copiar e colar a linha de comando neste formato também.)

mdfind '(kMDItemFSName=*.dmg)' | while IFS= read -r line; \
do printf "$line " & hdiutil isencrypted "$line"; \
done > dmg_file_list; grep ': YES' dmg_file_list > encrypted_dmg_file_list; \
clear; cat encrypted_dmg_file_list

Eu provavelmente iria grep para "criptografado: sim" no caso da saída de hdiutil mudanças no futuro. Além disso, se você usar >> dmg_file_list você pode querer remover um arquivo já existente primeiro (ou usar > dmg_file_list ).
— nohillside

@patrix, The >> foi erro de digitação. Eu corrigi isso. Quanto a greping para mais, então eu fiz ... bem as coisas mudam e o código é quebrado, no entanto, só precisa ser corrigido então. O que eu forneci foi um exemplo prático de apenas uma maneira de alcançar o objetivo. Não é a única maneira ou, necessariamente, a melhor maneira, apenas uma maneira que funcionou no meu sistema e pode ser adaptada conforme a necessidade de quem quer que o utilize. Como exemplo, eu poderia tê-lo escrito para que o arquivo encrypted_dmg_file_list tivesse o nome completo do caminho, já que o arquivo é designado como criptografado. Eu não fiz porque é tarde e estou cansado. :)
— user3439894

isso funcionou. obrigado! mas sai com um erro: LSOpenURLsWithRole() failed with error -600 for the file /Users/user/encrypted_dmg_file_list. alguma ideia?
— jakethedog

Substitua o open na última linha com cat, isso listará os volumes criptografados diretamente no Terminal.
— nohillside

@melchior, pelo cat sugestão por patrix, eu editei a linha de comando como então não é dependente de abrir quaisquer alterações do padrão com o Launch Services. Você sempre pode abrir os arquivos manualmente em um editor de texto também.
— user3439894

2

O Spotlight simplesmente não possui metadados suficientes para diferenciar as opções do sistema de arquivos armazenadas em um DMG. Em outras palavras, é como perguntar quais documentos do Pages têm palavras em francês usando apenas mdls. Os dados para fazer essa pesquisa não estão contidos nos metadados.

O comando adequado para verificar se um arquivo de imagem específico está criptografado é hdiutil isencrypted /path/to/dmg

Exemplo:

host:~ user$ hdiutil isencrypted /Users/user/Downloads/test.dmg

Saída:

encrypted: YES
blocksize: 512
uuid: DE78A7BE-2B64-4556-8EC9-93DFAC15A839
private-key-count: 0
passphrase-count: 1
max-key-count: 1
version: 2

Como isso funcionaria junto com o mdfind etc?
— nohillside

1
@patrix Estou apenas tentando criar o mdfind adequado | xargs | Comando hdiutil (| grep)
— klanomath

Isso é +1 por mim. É na fronteira de "lição de casa" e "fazer o meu trabalho para mim", que é o que o OP parece estar buscando em questões recentes, @patrix
— bmike

1
@bmike está perto, mas não consigo descobrir como mostrar o arquivo que resulta criptografado: SIM. E para o registro, é um projeto muito pessoal, procurando por uma dmg especial de centenas de mais de dez anos atrás. Isso me ajudará muito. muito além dos dias de lição de casa.
— jakethedog

Excelente @melchior - aprender pipe-fu é difícil. Minha sugestão principal é canalizar a saída do comando parcial para um arquivo e depois catar esse arquivo para o próximo comando. Então você pode ver com o que está trabalhando e se você tem um erro estranho, tente inspecionar os dados para ver qual peça está causando a falha
— bmike

1

Uma solução usando mdfind -0 e xargs :

mdfind -0 "kMDItemFSName == '*.dmg'" | xargs -0 -IX ksh -c '
    if    hdiutil isencrypted "X"  2>&1 | grep -q "encrypted: YES"
    then  echo "X -ENCRYPTED"
    fi'
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.