MD5Sum diferente para o mesmo arquivo no mesmo diretório

2

Eu acho estranho como eu consegui pegar o md5sum diferente usando exatamente o mesmo arquivo do mesmo diretório. A saída como abaixo:

[root@testlabs Config]# ls  
Backup_Files  
hostname1-config.uac  
hostname2-config.uac  
hostname3-config.uac  
[root@testlabs Config]# ls hostname1-config.uac | md5sum  
2a52f0eb11f6478a4f8aeee1c0ac90dd  -      
[root@testlabs Config]# md5sum hostname1-config.uac  
d41d8cd98f00b204e9800998ecf8427e  hostname1-config.uac  

Posso saber qual é a maneira correta de obter o resultado correto do md5sum? Obrigado.

Eu fiz isso para comparar o MD5 de dois arquivos (arquivo original e arquivo de cópia de segurança). A convenção de nomenclatura do arquivo original é hostname1-config.uac, enquanto o arquivo de backup é hostname1-201411071649.uac; mas são apenas cópias (cp -p).

Primeiro método

(não funciona)

 #!/bin/bash
 # ...
 #
 ls hostname1-config.uac | md5sum hostname1-config.uac > /tmp/md5sum.tmp
 ARCHIVE_DIR="/tmp/Archive"
 FULL_HOSTNAME='/bin/sort -d /tmp/full_hostname.tmp'
 TIMESTAMP='/bin/date +%Y%m%d%H%M -r $FULL_HOSTNAME'

 for HOSTNAME in '/bin/sort -d /tmp/hostname.tmp'
 do
     ls $ARCHIVE_DIR | grep -i --text $HOSTNAME-$TIMESTAMP.uac | md5sum -c /tmp/md5sum.tmp >> /tmp/md5sum2.tmp
 done

Segundo método

(Funcionou perfeitamente na linha de comando, mas não no script)

Na linha de comando

[root@testlabs Config]# md5sum hostname1-config.uac
ca3434263400ea2b4ffbc107ef729b8a  hostname1-config.uac
[root@testlabs Config]# md5sum hostname1-config.uac > md5.tmp
[root@testlabs Config]# cd /tmp/Archive
[root@testlabs Archive]# md5sum hostname1-config.uac
ca3434263400ea2b4ffbc107ef729b8a  hostname1-config.uac
[root@testlabs Archive]# echo 'Tampered!' > hostname1-config.uac
[root@testlabs Archive]# cat hostname1-config.uac | md5sum -     c /Network_Backup/Config/md5.tmp
hostname1-config.uac: FAILED
md5sum: WARNING: 1 of 1 computed checksum did NOT match
[root@testlabs Archive]# rm -f hostname1-config.uac
[root@testlabs Archive]# cd /tmp/Config
[root@testlabs Config]# cp -p hostname1-config.uac /tmp/Archive
[root@testlabs Config]# cd /tmp/Archive
[root@testlabs Archive]# cat hostname1-config.uac | md5sum -c /Network_Backup/Config/md5.tmp
hostname1-config.uac: OK

No script

#!/bin/bash
# ...
#
CONFIG_DIR="/tmp/Config"
ARCHIVE_DIR="/tmp/Archive"
HOSTNAME='/bin/sort -d /tmp/hostname.tmp'
FULL_HOSTNAME='/bin/sort -d /tmp/full_hostname.tmp'
TIMESTAMP='/bin/date +%Y%m%d%H%M -r $FULL_HOSTNAME'

cd $CONFIG_DIR
md5sum $FULL_HOSTNAME > /tmp/md5sum.tmp
cd $ARCHIVE_DIR
cat $HOSTNAME-$FILE_TIMESTAMP.uac | md5sum -c /tmp/md5sum.tmp >> /tmp/md5sum2.tmp

O resultado retornado em /tmp/md5sum2.tmp:
hostname1-config.uac: FAILED abre ou lê

    
por Win.T 17.11.2014 / 02:58

2 respostas

2

A resposta FAILED aberta ou lida acontece quando o arquivo especificado no arquivo de soma de verificação md5 (md5sum.tmp no seu caso) não existe.

Por exemplo.

[user@localhost tmp]$ cd /tmp/testfolder
[user@localhost testfolder]$ touch dog
[user@localhost testfolder]$ md5sum dog > /tmp/md5sum.tmp
[user@localhost testfolder]$ md5sum -c /tmp/md5sum.tmp
dog: OK
[user@localhost testfolder]$ cd ..
[user@localhost tmp]$ md5sum -c /tmp/md5sum.tmp
md5sum: dog: No such file or directory
dog: FAILED open or read
md5sum: WARNING: 1 listed file could not be read

Note que eu acredito que o programa md5sum não olha para a entrada padrão quando passa a opção -c. Ele simplesmente observa as somas de verificação no arquivo especificado pela opção -c. Se eles existirem e o nome do arquivo corresponder, então ele compara e tudo fica feliz.

Embora provavelmente exista uma maneira melhor, armazenar o resultado de dois md5sums separados em uma variável e, em seguida, compará-los com uma instrução if é provavelmente a abordagem que eu tomaria.

Mais ou menos assim.

#!/bin/bash
firstfile='cat dog | md5sum '
# alternately could have used firstfile=$(md5sum < dog ) to ovoid UUOC
secondfile='cat mouse | md5sum '
if [ "$firstfile" == "$secondfile" ]; then
    echo "They Match!"
else
    echo "They Don't Match!"
fi
    
por 17.11.2014 / 06:14
3

O último. Quando você executa ls file | md5sum , está obtendo o md5sum da string file\n e não do conteúdo do arquivo.

Como regra geral, você nunca passa um arquivo com ls file | command , quase não há casos em que isso fará o que você deseja. Se você quiser dar um nome de arquivo a um comando e esperar que ele faça algo com esse arquivo, você o fornece como um argumento:

command file

Portanto, no caso de md5sum , você deve executar

$ md5sum hostname1-config.uac
    
por 17.11.2014 / 03:08

Tags