ファイルチェックサムの取得コマンドまとめ
色んなOSでファイルチェックサムを取得するコマンドを調べる機会があったので、結果をメモしておく。
調べたOSは次の通り。
- AIX 6.1
- HP-UX 11i v3
- RHEL 5.6
- Mac OS X 10.5
- Windows XP
まとめ
コマンド | AIX | HP-UX | RHEL | Mac | Win |
---|---|---|---|---|---|
sum | o | o | o | o | x |
cksum | o | o | o | o | x |
md5sum | x | ? | o | x | x |
csum | o | x | x | x | x |
md5 | x | x | x | o | x |
sha1sum | x | x | o | x | x |
openssl | o | o | o | o | x |
fciv | x | x | x | x | o |
sum
sum は古くからあるコマンドで、16ビットのチェックサムとブロック数を表示する。Unixには大体入っているが、BSD系とSystemV系では計算アルゴリズムが違うため互換性がないらしい。今あえて使うべきものではない。
cksum
cksum は sum の次に古いコマンドで、CRCチェックサムとファイルのバイト数を表示する。これもUnixには大体入っているが、CRCの計算方法がまちまちで互換性がない場合があるらしい。やはり今あえて使うべきものではない。
md5sum
md5sum は、入力ファイルに対するMD5チェックサムを表示する。RHELには最初から入っていたので、Linuxユーザーにはポピュラーなのだと思う。ネットで配布されるファイルにはMD5チェックサムがついていることが多い。(最近は、SHA1が主流になりつつあるみたいだが。)
またmd5sumは、チェックサムを表示するだけでなく、自身の出力結果を書いたファイルを読み込んで各ファイルに対応するチェックサムを確認する機能がある。(-cオプション)diffや目で確認する必要がないので地味に楽である。
# 出力例
$ md5sum /path/to/file.txt
745dcdd3ddd4200fbab28f92f73120fc /path/to/file.txt
なおHP-UXでは md5sumはアドオンとして提供されているようで、自分の使った環境には入っていなかった。
csum
csum も、MD5チェックサムを表示するコマンドである。これはAIXに特有のコマンドのようだ。md5sumとまったく同じフォーマットで表示を行うが、オプションや細かな動作は異なる。また、-iオプションで入力ファイルを指定することで、チェックサムを確認する機能もある。
ちなみに、md5sumはディレクトリが入力されるとエラーになるが、csumはmd5sumと違ってディレクトリのチェックサムも表示する。inodeの情報を入力にしているのだろうか。いずれにせよ役に立たない機能である。
md5
md5 は、Macに入っているMD5チェックサム計算コマンド。確認機能はない。FreeBSDにも入っているのかもしれないが確証はない。
デフォルトではLinuxのmd5sumと出力形式が違うが、-rオプションをつけるとmd5sum風の出力に変わる。diffを取る時には役に立つ。
# 出力例 $ md5 /path/to/file.txt MD5 (/path/to/file.txt) = 745dcdd3ddd4200fbab28f92f73120fc # -rをつけると形式がmd5sum風に変わる $ md5 -r /path/to/file.txt 745dcdd3ddd4200fbab28f92f73120fc /path/to/file.txt
openssl
openssl はたくさんの機能をもったコマンドなのだが、dgstサブコマンドによってチェックサムの計算ができる。MacやLinuxだけでなく、AIX、HP-UXにも入っていた。OpenSSHの前提ソフトウェアなので、sshをインストールする際に一緒に入ったのかもしれない。いずれにせよ、今の時代sshはあちこちで使われているので、汎用的に使えるコマンドだと思って間違いはない。
opensslはMD5だけでなくSHA1などのチェックサムも計算することができる。
$ openssl dgst -md5 /path/to/file.txt MD5(/path/to/file.txt)= 745dcdd3ddd4200fbab28f92f73120fc $ openssl dgst -sha1 /path/to/file.txt SHA1(/path/to/file.txt)= d008ba248c66d93c2cc51447b09b081e500f2845
ただし、見て分かるように出力形式がMacのmd5と同じ。つまりLinuxのmd5sumと違う。diffを取るときにちょっと不便である。というわけで、opensslの結果を整形するsedコマンドを書いた。パイプ以降をコピペすればdiffで比較できるようになる。
$ openssl dgst -md5 file.txt | sed -e 's/^.*(\(.*\))= \(.*\)$/\2 \1/' 745dcdd3ddd4200fbab28f92f73120fc file.txt # awkでもいいぞ! $ openssl dgst -md5 file.txt | awk '{gsub(/^.*\(|\)=/,"");print $2" "$1}' 745dcdd3ddd4200fbab28f92f73120fc file.txt
ファイル名に(や)が含まれていると上手く動かない予感がするが、その点はご了承いただきたい。