
Ich finde es merkwürdig, dass ich mit derselben Datei aus demselben Verzeichnis unterschiedliche MD5-Summen erhalten habe. Die Ausgabe ist wie folgt:
[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
Darf ich wissen, wie ich das richtige MD5SUM-Ergebnis erhalte? Danke.
Ich habe dies getan, um den MD5-Wert zweier Dateien (Originaldatei und Sicherungskopiedatei) zu vergleichen. Die Namenskonvention der Originaldatei lautet hostname1-config.uac, während die Sicherungsdatei hostname1-201411071649.uac lautet; es handelt sich jedoch nur um Kopien (cp -p).
Erste Methode
(Funktioniert nicht)
#!/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
Zweite Methode
(Funktionierte perfekt in der Befehlszeile, aber nicht im Skript)
In der Befehlszeile
[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
Im Skript
#!/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
Das zurückgegebene Ergebnis in /tmp/md5sum2.tmp:
hostname1-config.uac: Öffnen oder Lesen fehlgeschlagen
Antwort1
Letzteres. Wenn Sie ausführen ls file | md5sum
, erhalten Sie die MD5-Summe der Zeichenfolge file\n
und nicht des Inhalts der Datei.
Als allgemeine Regel gilt:niemalsWenn Sie eine Datei mit übergeben ls file | command
, gibt es fast keine Fälle, in denen das das gewünschte Ergebnis bringt. Wenn Sie einem Befehl einen Dateinamen geben möchten und erwarten, dass er etwas mit dieser Datei macht, geben Sie ihn als Argument an:
command file
Im Fall von md5sum
sollten Sie also Folgendes ausführen:
$ md5sum hostname1-config.uac
Antwort2
Die Antwort „Öffnen oder Lesen fehlgeschlagen“ erfolgt, wenn die in der MD5-Prüfsummendatei angegebene Datei (in Ihrem Fall md5sum.tmp) nicht vorhanden ist.
Zum Beispiel.
[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
Beachten Sie, dass das Programm md5sum meines Erachtens nicht die Standardeingabe betrachtet, wenn die Option -c übergeben wird. Es betrachtet einfach die Prüfsummen in der durch die Option -c angegebenen Datei. Wenn sie vorhanden sind und der Dateiname übereinstimmt, vergleicht es sie und alles ist in Ordnung.
Obwohl es vermutlich einen besseren Weg gibt, würde ich wahrscheinlich den Ansatz wählen, das Ergebnis zweier separater MD5-Summen in einer Variablen zu speichern und sie dann mit einer if-Anweisung zu vergleichen.
Ungefähr so.
#!/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