md5sum等でチェックサムファイルを作成しておくことで、リモートサーバへコピーしたファイルの整合性を確認することができるようになります。例えば、scpコマンドはコピー先ファイルの整合性を保障していません(rsyncコマンドはコピー時にチェックサムを計算しているので本手順は不要です)。この記事ではmd5sumでチェックサムを比較する手順を記載します。
Table of Contents
1 ファイルのチェックサムを比較する
ファイルを指定してチェックサムをmd5ファイルに保存します。
$ md5sum file.txt | tee file.md5 9af2f8218b150c351ad802c6f3d66abe file.txt
file.txtとfile.md5をリモートサーバに送信します。
$ scp file.txt file.md5 <server>:<path>
リモートサーバにて、file.txtを格納したディレクトリにてfile.md5を-cオプションで指定します。チェックサムが一致した場合は戻り値が0になります。
$ md5sum -c file.md5 file.txt: OK $ echo $? 0
チェックサムが一致しなかった場合やファイルが存在しない場合は、戻り値が0でない値になります。
$ md5sum -c file.md5 file.txt: FAILED md5sum: WARNING: 1 computed checksum did NOT match $ echo $? 1
2 ディレクトリ内の全ファイルのチェックサムを比較する
以下のようなディレクトリを用います。
$ tree dir dir ├── file1.txt └── subdir └── file2.txt
全ファイルのチェックサムを比較するには全ファイルをmd5sumで指定する必要があります。findコマンドを使うことで全ファイルの指定を省略できます。
$ cd dir $ md5sum $(find . -type f) | tee ../dir.md5 3d709e89c8ce201e3c928eb917989aef ./subdir/file2.txt 5149d403009a139c7e085405ef762e1a ./file1.txt
dirとdir.md5を別サーバに送信します。
$ scp -r dir dir.md5 <server>:<path>
リモートサーバにて、dir内でdir.md5を-cオプションで指定します。全てのチェックサムが一致した場合は戻り値が0になります。
$ cd dir $ md5sum -c ../dir.md5 ./subdir/file2.txt: OK ./file1.txt: OK $ echo $? 0
チェックサムが一致しなかったり存在しないファイルがある場合は、戻り値が0でない値になります。
$ cd dir $ md5sum -c ../dir.md5 ./subdir/file2.txt: FAILED ./file1.txt: OK md5sum: WARNING: 1 computed checksum did NOT match $ echo $? 1