何処からかファイルをダウンロードしたときは、念のためハッシュ値が合っているか確認する場合があると思う。 今回は、そんなハッシュ値の検証をワンライナーでやる方法について。 シェルスクリプトとかで使うと便利だと思う。
動作確認に使った環境は次の通り。
$ cat /etc/lsb-release DISTRIB_ID=Ubuntu DISTRIB_RELEASE=18.04 DISTRIB_CODENAME=bionic DISTRIB_DESCRIPTION="Ubuntu 18.04.2 LTS" $ uname -r 4.15.0-50-generic
下準備
たぶん既に入ってるけど coreutils
をインストールしておく。
$ sudo apt-get -y install coreutils
ちなみに macOS でも Homebrew で coreutils
をインストールすれば同じようにいける。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.14.4 BuildVersion: 18E226 $ brew install coreutils
サンプルファイルを用意する
例として、次のようなファイルを用意する。
$ echo "Hello, World" > greet.txt
このファイルの MD5 のハッシュ値は次の通り。
$ md5sum greet.txt 9af2f8218b150c351ad802c6f3d66abe greet.txt
ハッシュ値が一致するかチェックする
例えば、このファイルがいつの間にか改ざんされて中身が書き換わっていないか確認したいとする。
そんなときは記録しておいたハッシュ値とファイル名を md5sum
コマンドに -c
オプションと共に標準入力から渡す。
$ echo "9af2f8218b150c351ad802c6f3d66abe greet.txt" | md5sum -c - greet.txt: OK
すると、渡されたハッシュ値とファイル名を元に比較して一致しているかをチェックできる。
試しに、ファイルをちょっとばかり変更してみよう。
$ echo "Good bye, World" > greet.txt
これで、当然ながらハッシュ値は全く違ったものになる。
$ md5sum greet.txt 92214ff18f0f6ba9620d271b91add216 greet.txt
この状況で、先ほどと同じハッシュ値と共に md5sum
で検証してみる。
$ echo "9af2f8218b150c351ad802c6f3d66abe greet.txt" | md5sum -c - greet.txt: FAILED md5sum: WARNING: 1 computed checksum did NOT match
ちゃんとエラーになった。
リターンコードについても非ゼロの値がセットされている。
$ echo $? 1
確認できたらファイルは元に戻しておく。
$ echo "Hello, World" > greet.txt
SHA 系でも試してみる。
念のため SHA 系のコマンドでも確認しておこう。
まずは sha1sum
コマンドから。
$ sha1sum greet.txt 4ab299c8ad6ed14f31923dd94f8b5f5cb89dfb54 greet.txt $ echo "4ab299c8ad6ed14f31923dd94f8b5f5cb89dfb54 greet.txt" | sha1sum -c - greet.txt: OK
よさそう。
続いて sha256sum
コマンドについても。
$ sha256sum greet.txt 8663bab6d124806b9727f89bb4ab9db4cbcc3862f6bbf22024dfa7212aa4ab7d greet.txt $ echo "8663bab6d124806b9727f89bb4ab9db4cbcc3862f6bbf22024dfa7212aa4ab7d greet.txt" | sha256sum -c - greet.txt: OK
ばっちり。
複数のファイルを一度にチェックする
ちなみに複数のファイルを一度にチェックすることもできる。
例えばファイルを一つ追加しておく。
$ echo "Konnichiwa, Sekai" > aisatsu.txt
MD5 のハッシュ値は次の通り。
$ md5sum aisatsu.txt 6656d68759745ed46727e0b42e4121b5 aisatsu.txt
複数のファイルを一度にチェックするときは、次のように複数行に渡って対応関係を渡せば良い。
$ cat << 'EOF' | md5sum -c - 9af2f8218b150c351ad802c6f3d66abe greet.txt 6656d68759745ed46727e0b42e4121b5 aisatsu.txt EOF greet.txt: OK aisatsu.txt: OK
いじょう。