
Я нахожу это странным, так как мне удалось получить разные md5sum, используя тот же самый файл из того же каталога. Вывод следующий:
[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
Могу ли я узнать, как правильно получить правильный результат md5sum? Спасибо.
Я сделал это, чтобы сравнить MD5 двух файлов (исходный файл и файл резервной копии). Соглашение об именовании исходного файла — hostname1-config.uac, а файла резервной копии — hostname1-201411071649.uac; но это всего лишь копии (cp -p).
Первый метод
(Не работает)
#!/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
Второй метод
(Работает отлично в командной строке, но не в скрипте)
В командной строке
[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
В сценарии
#!/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
Возвращенный результат в /tmp/md5sum2.tmp:
hostname1-config.uac: НЕУДАЧНО открыть или прочитать
решение1
Последнее. При запуске ls file | md5sum
вы получаете md5sum строки file\n
, а не содержимого файла.
Как правило, выникогдапередайте файл с помощью ls file | command
, почти нет случаев, когда это сделает то, что вам нужно. Если вы хотите дать команде имя файла и ожидаете, что она что-то сделает с этим файлом, вы передаете его в качестве аргумента:
command file
Итак, в случае md5sum
, вам следует запустить
$ md5sum hostname1-config.uac
решение2
Ответ FAILED open or read происходит, когда файл, указанный в файле контрольной суммы md5 (md5sum.tmp в вашем случае), не существует.
Например.
[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
Обратите внимание, что я считаю, что программа md5sum не смотрит на стандартный ввод, когда передается опция -c. Она просто смотрит на контрольные суммы в файле, указанном опцией -c. Если они существуют и имя файла совпадает, то она сравнивает их, и все в порядке.
Хотя, вероятно, есть лучший способ, я бы, вероятно, использовал подход, заключающийся в сохранении результата двух отдельных md5sums в переменной и последующем сравнении их с помощью оператора if.
Что-то вроде этого.
#!/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