(小ネタ)md5sumを使ってリモートにあるファイルとのチェックサムを検証するワンライナー
先に結論から書きます。
SSH接続した先にあるファイルとローカルファイルを比較する
$ ssh user@host md5sum /path/to/remote/hoge.txt | awk '{ print $1 }' /path/to/local/hoge.txt | md5sum -c
/path/to/local/hoge.txt: OK
AWS S3上にあるファイルとローカルファイルを比較する
$ echo `aws s3 cp s3://path/to/remote/hoge.txt - | md5sum | awk '{ print $1 }'` /path/to/local/hoge.txt | md5sum -c
/path/to/local/hoge.txt: OK
※S3の場合は、コンテンツをローカルにDLしてから計算している関係で、ファイルのサイズが大きい場合は要注意です。
背景
昨今では、ソフトウェアや関連するファイルの配信は自動化する事がほとんどかと思います。
我々も、とあるプロジェクトでシェルスクリプトのLinuxサーバーへの配置したり、Sparkで使っているJarアーカイブのS3への配置などをAnsibleを使って行っています。
この際、正しくデプロイできたかどうかの指標として md5sum
を使う事があります。
Ansibleを使っていれば何かしらのファイルで失敗した時にコマンド自体が失敗するのでそこまで心配する必要も無いかと思いますが、実行したコマンドがそもそも正しかったか等、心配性なので気になります。(※)
複数ファイルを配置する際は、対象ファイルのうち1つでも検証に成功すればOKとしています。
また、Ansibleを修正した時のPullReqを作る際、Descriptionにこの結果を書いておくと親切です。
※このプロジェクトでは毎回デプロイ対象が一定でないのと、リリース回数が少ないので完全自動化はしていないです。
md5sumコマンドについて
glibcの一つで、その名の通り入力されたデータのmd5を計算します。
使い方は主にこんな感じです:
ローカルファイルや標準入力から計算
# /bin/sh ファイルのmd5
$ md5sum /bin/sh
e02ea3c3450d44126c46d658fa9e654c /bin/sh
# 文字列 "md5" のmd5
$ echo 'md5' | md5sum
772ac1a55fab1122f3b369ee9cd31549 -
# ファイルを複数指定した場合
$ md5sum /bin/sh /bin/bash
e02ea3c3450d44126c46d658fa9e654c /bin/sh
5e666695cf08d1638bb85684e30185ee /bin/bash
チェックサムの確認
-c
を付けて、その後 md5sum
が出力する形式の内容をローカルファイル、または標準入力から入力します(複数可)
$ md5sum /bin/sh | md5sum -c
/bin/sh: OK
# 以下も同じ
$ echo 'e02ea3c3450d44126c46d658fa9e654c /bin/sh' | md5sum -c
/bin/sh: OK
# 複数も可
$ md5sum /bin/sh /bin/bash | md5sum -c
/bin/sh: OK
/bin/bash: OK
入力する形式ですが、 {MD5メッセージ} {ファイルパス}
または、BSD形式である MD5 ({ファイルパス}) = {MD5メッセージ}
となっていれば良いみたいです。なので、以下のようにする事でSSH経由でチェックサムの検証が行えます:
$ echo `ssh user@host md5sum /path/to/remote/hoge.txt | awk '{ print $1 }'` | /path/to/local/hoge.txt | md5sum -c
/path/to/local/hoge.txt: OK
※接続先にも md5sum
が入っている事が必須になります。awk
を使って、結果からファイル名を取り除いているのがみそです。
全然関係無いですが、今日はプレミアムフライデーですね。皆さんの会社でも定着していますか?
実は弊社もプレミアムフライデーを採用しているので、今日はこの後切りの良いところで終えようと思います。(笑)
また、弊社ではフルリモートで働けるメンバーを募集しています!他にも働きやすさを重視した取り組みや改善を行っていますので、興味のある方は↓の採用ページをご覧ください!
コメントを残す