
同じディレクトリのまったく同じファイルを使用して異なる 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 結果を得るための正しい方法を教えていただけますか? ありがとうございます。
これは、2 つのファイル (元のファイルとバックアップ コピー ファイル) の 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
2番目の方法
(コマンドラインでは完璧に動作しましたが、スクリプトでは動作しませんでした)
コマンドラインで
[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 オプションで指定されたファイル内のチェックサムを参照するだけです。チェックサムが存在し、ファイル名が一致する場合は、それを比較してすべてが正常になります。
おそらくもっと良い方法があると思いますが、2 つの別々の 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