Compreendendo um comando Find complexo

0

Estou trabalhando na limpeza de código de script em uma máquina linux que um desenvolvedor anterior criou quando me deparei com este comando:

find / -xdev -type f | egrep -v "^/etc/shadow|^/etc/random-seed|^/root/logs/|^/root/.ash|^/root/configs" | xargs md5sum 2> /dev/null | tr -s "[:space:]" | md5sum | cut -d\  -f1

Estou tentando entender o que exatamente cada parte do comando faz, mas a parte do grep está me jogando fora.

Eu sei que a saída é essencialmente um valor de soma de verificação do sistema de arquivos, mas preciso saber exatamente como isso ocorre.

Obrigado.

    
por lukemk1 09.11.2017 / 17:11

2 respostas

1

Em câmera lenta:

egrep -v "^/etc/shadow|^/etc/random-seed|^/root/logs/|^/root/.ash|^/root/configs"
  • egrep significa que estamos usando EREs (regexps estendidos)
  • -v inverte a seleção (mantenha o que não corresponde)
  • O | está ORing as várias expressões
  • ^ é a correspondência "início da linha"

Por isso, remove as linhas que começam com /etc/shadow , /etc/random-seed etc ..., o que exclui os arquivos desses diretórios.

Então, globalmente:

  • encontre todos os arquivos somente no sistema de arquivos / (devido a -xdev ), então isso exclui /proc por exemplo e possivelmente outros sistemas de arquivos (dado o resto, eu não ficaria surpreso se /var seja um FS separado) e filtre diretórios específicos como mostrado acima.
  • calcula um hash MD5 de todos esses arquivos ( xargs md5sum )
  • massageia essa lista de hashes um pouco
  • calcula um hash MD5 da lista de hashes MD5 md5sum | cut -d\ -f1

Em outras palavras, ele calcula um hash combinado de todos os arquivos no disco, provavelmente para verificar se nada foi alterado desde a última vez em que foi computado (é por isso que eu ficaria surpreso que / var seja considerado conta, já que seu conteúdo muda com o tempo: /var/log , /var/mail , /var/lib ...)

    
por 09.11.2017 / 17:57
0

A resposta do xenoid é válida, então não vou repeti-lo. Mais alguns esclarecimentos desde que lukemk1 os pediu em seu comentário acima sobre esta parte: | xargs md5sum 2 > / dev / null | tr -s "[: space:]" | md5sum | corte -d \ -f1

"| xargs md5sum": permite que você aplique o comando md5sum com o argumento sendo todos os nomes de arquivos canalizados (pode ser um pouco mais complexo aqui).

"2 > / dev / null": significa jogar fora o fluxo stderr

"| tr -s" [: space:] "": (por "man tr" [: space:] é todo espaço em branco ou vertical e -s flag (--squeeze-repeats) pressiona repetições consecutivas desta tipo de espaços.

"| md5sum": pega o md5sum do fluxo de md5sums

"| cut -d \ -f1": Usando espaço ("\") como campos delimitadores, imprima apenas o primeiro campo (em vigor apenas o número md5sum)

Isso não fazia parte da questão, mas uma questão que vejo com o comando geral é que, se houver espaço nos nomes dos arquivos, não funcionará como esperado; para corrigir, você precisa usar encontrar ... -print0 | .... | xargs -0 ....

    
por 10.11.2017 / 16:27