我觉得很奇怪,因为我设法使用同一目录中的完全相同的文件获得不同的 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: FAILED open or read
答案1
后者。当您运行时ls file | md5sum
,您将获得字符串的 md5sum file\n
,而不是文件内容的 md5sum。
作为一般规则,您绝不使用 传递文件ls file | command
,几乎没有情况可以满足您的要求。如果您想为命令指定文件名并期望它对该文件执行某些操作,则可以将其作为参数提供:
command file
所以,在这种情况下md5sum
,你应该运行
$ md5sum hostname1-config.uac
答案2
当 md5 校验和文件(在您的情况下为 md5sum.tmp)中指定的文件不存在时,会发生响应 FAILED open or read 。
例如。
[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 选项指定的文件中的校验和。如果它们存在并且文件名匹配,那么它就会比较它并且一切都很顺利。
虽然可能有更好的方法,但将两个单独的 md5sum 的结果存储在一个变量中,然后将它们与 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