第二種方法

第二種方法

我覺得很奇怪,因為我設法使用同一目錄中的完全相同的檔案來獲得不同的 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

相關內容