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 {}
jakethedog
fonte
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
user3439894
fonte
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
klanomath
fonte
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'
fd0
fonte