SEをやっていてsshみたいなのは全然使えず手でSVNからダウンロード、手作業でリリースみたいなことは普通にあったりします。
それ自体は仕方ないなと思うのですが、あちこちにファイルを置く場合、本当にリリースできたか心配なことが多いです。
そういうことを少しでも減らす方法がないか調べてみました。
md5sumの--checkオプションでファイルチェックを行う
例えばvimのダウンロードページに行くとダウンロードディレクトリ配下にMD5SUMというファイルが用意されています。
https://ftp.nluug.nl/pub/vim/unix/MD5SUMS
このファイルをダウンロードしてLinuxなどにインストールされている md5sum
に --check
というオプションを使うとこんな感じで出力されます。
※下記の例では vim-8.1.tar.bz2は空ファイル、 vim-8.2.tar.bz2` は正しくダウンロードしたファイルです
% md5sum -c MD5SUMS
(略)
md5sum: vim-8.0.tar.bz2: No such file or directory
vim-8.0.tar.bz2: FAILED open or read
vim-8.1.tar.bz2: FAILED
vim-8.2.tar.bz2: OK
md5sum: WARNING: 62 listed files could not be read
- 存在しないvim-8.0.tar.bz2 → 開けなかったメッセージ(FAILED open or read)
- ダミー用に作った空ファイルのvim-8.1.tar.bz2 → FAIL
- ちゃんとダウンロードした vim-8.2.tar.bz2 → OK
となっています。
md5sumの--checkオプションで使えるフォーマット
MD5SUMSというファイルの中身は単純で各行が下記のようにハッシュ値、ファイル名が並べられています。ちなみに試しに絶対パスでやっても上手く動きました。
6bf455c878d536f3957f0bc89cca539e README
(略)
2f3e6ab74d20eea2dc00cedc3f0ee4e8 vim-8.2.tar.bz2
このフォーマットは md5sum
コマンドの出力であり、マニュアルによると下記のフォーマットになっています。
各入力 FILE に対する出力フォーマットは、 MD5 sum 値・スペース・ファイルタイプを示す文字 (バイナリなら `*'、テキストなら ` ')・ファイル名、からなる。 --check は入力がこのフォーマットであるものとみなす。
md5sum - コマンド (プログラム) の説明 - Linux コマンド集 一覧表
テキストの場合、空白1文字です。
ちなみに、このフォーマットいくつか流儀があるらしくGNUの cksum
コマンドによるとMD5SUMは Untagged output formatらしく、他に
- Legacy output format
CRC、バイト数、ファイル名の順
(例:4012370823 3345 MD5SUMS
) - Tagged output format
ハッシュ方法 (ファイル名) = ハッシュ値
例: (MD5 (MD5SUMS) = 3cf87c0a65d4fc00bc091627c9850617
)
cksum output modes
の方法があるようです。さらにsigファイルのように署名を検証するツールがありますが、ここでは扱いません。
https://www.gnupg.org/gph/en/manual/x135.html
https://ac-as.net/verification-of-gpg-signature/
SEの手ファイル展開に使用する
上記のmd5sumを使う方法はLinuxなどmd5sumコマンドが使える環境でのみ有効です。ダウンロードしてきて使っても良いのですが、客先で使わせてーっていうのが面倒な方は下記にこんな感じってPowerShellを残しておきます。
Windows11のPowershell5で確認しましたが、10でも大丈夫だと思います。
# ハッシュ値とファイル名一覧が書かれたファイルを指定
$hashfile = Get-ItemChild "(MD5ファイル)"
# 一覧が書かれたファイルのフォルダへ移動
pushd $hashfile.Directory
# ファイルを開く
get-content $hashfile `
| %{ $hash, $filename = $_ -split " ", 2 # スペース2つで分割、ただし作成後の配列は2つだけにする
if (Test-Path $filename) { # ファイルが存在したら
if ((Get-FileHash -Algorithm MD5 $filename).Hash -eq $hash) { # MD5でハッシュ値をとり一覧の中にあったハッシュ値と比較
echo ("OK: " + $filename)
} else {
echo ("NG: " + $filename)
}
} else {
echo ("Lost: " + $filename) # 存在しなかったらLostと表示
}
}
# 移動まえに戻る
popd
チェック用のファイルを作成する
md5sum --check
に使うファイルは、リリース前に展開するフォルダに対して find . -type f -exec md5sum {} \;
とすれば作成できます。
一応、Powershellは下記みたいな感じになるかと。
# 事前に一覧をとるフォルダに移動してください
# ファイル一覧を取得
# ファイルハッシュを取得、その後にスペース2文字をくっつけ
# ファイルパスを出力。このとき、相対パスにし、先頭の.\は削除、パスの区切りの\も/に変更する
dir -File -Recurse
| %{ ( `
(Get-FileHash -Algorithm MD5 $_.FullName).Hash `
+ " " `
+ ((Resolve-Path -Relative $_.FullName) -replace "^\.\\", "").Replace("\", "/") `
)}