Testar a integridade do arquivo tar no bash


25

Eu tenho um script bash que cria um arquivo '.tar'. Depois que o arquivo é criado, eu gostaria de testar sua integridade e enviar um email ao usuário root se a integridade estiver ruim.

Eu sei que precisaria usar o comando tar -tf /root/archive.tarpara verificar a integridade do arquivo, mas como implementaria isso em uma declaração bash if e verificaria se há erros?

Respostas:


33

Se tarencontrar erros em sua entrada, será exit(3)¹ com um valor de saída diferente de zero. Isso - com a maioria das tarimplementações - também é feito ao listar o conteúdo do arquivo t. Portanto, você pode simplesmente verificar o valor de saída de tarpara determinar se algo deu errado:

if ! tar tf /root/archive.tar &> /dev/null; then
    write_an_email_to_root
fi

Se o seu tarnão encontrar todos os erros t, você ainda poderá extrair o arquivo stdoutmorto e redirecioná stdout-lo /dev/null, o que seria a abordagem mais lenta, porém mais confiável:

if ! tar xOf /root/archive.tar &> /dev/null; then
    write_an_email_to_root
fi

Not Esta notação indica a página de manual, não a chamada real. Veja man 3 exit.


11
Você provavelmente desejará redirecionar a tarsaída para /dev/null, pois provavelmente não deseja vê-la.
Kevin

11
Nem todas as tarimplementações detectam ou relatam todos os erros com t( bsdtarnão, você pode usar tar xOf file.tar > /dev/nulllá). Nem todas as tarimplementações sairiam com o status de saída 2, star(255) ou bsdtar(1) não, mas o que importa é que o status de saída é diferente de zero aqui.
Stéphane Chazelas

11
Eu editei minha postagem de acordo. Como exit(2)eu estava relacionado à página de manual apropriada, não ao valor exato de saída (é por isso que eu tinha mencionado "diferente de zero" explicitamente na frase a seguir). Anotou isso (e alterou a seção para a direita -.-).
Andreas Wiese

sua resposta é apenas sobre a capacidade de listar e extrair, se eu abrir o arquivo tar com um editor e alterar algo, sua solução não pegará nenhum tipo de erro ... desculpe
THESorcerer

0

desculpe, mas você não pode, parece que o tar não possui a capacidade de testar (por exemplo, se você esquecer o * nix e tentar testá-lo com o winrar, o resultado será: "O comando não é suportado para esse tipo de arquivo")

Como mencionei nos comentários acima, o tar literalmente carece de CRC interno para ter um termo de comparação; portanto, se você alterar um arquivo tar com um editor, a listagem e a extração podem funcionar perfeitamente sem erros, mas extraem dados corrompidos

em conclusão, acabo aqui esperando uma solução, mas não há uma, felizmente existem duas boas notícias:

existem arquivos tar muito, muito, muito raros que também não são compactados com outro programa (como gzip, bzip2, etc.), portanto, esse programa terá uma solução de teste e as pessoas que não os compactam são meio coxas, REALMENTE LAME

para o meu problema pessoal, tenho sorte, depois de extraí-lo, encontrei um arquivo md5sum com CRC de todos os arquivos dentro (mesmo a pessoa que colocou o tar de arhive na rede e não queria compactá-lo, ele ainda queria ser pode ser verificado)


-5

Você pode fazer isso passando os seguintes argumentos para tar:

$ tar -cvzf test.tar test_file

2
As respostas de uma linha geralmente não são tão úteis. Considere expandir sua postagem para incluir algum material de origem (por exemplo, documentação) que suporte sua solução.
precisa saber é o seguinte

6
-ccria o arquivo nomeado via -f('test.tar'). -zgzips o arquivo. -vtorna detalhado. Tenho certeza de que essa não é uma solução precisa.
EpicVoyage
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.