web-dev-qa-db-ja.com

大量のZipファイルのパスワードを検証する

私は顧客のETLプロセスに取り組んでいます。別のベンダーは、パスワードで保護された約100個のZipファイルのセットとして生データを提供しています。

指定されたパスワードがこのファイルセットに対して正しいことを検証したいと思います。

私が現在使用しているスクリプトは、ループと7Zipを使用しています。

#!/bin/bash
set -x
for filename in ../TheData/*Data*of*.Zip; do
        echo "Checking $filename"
        7z t -ple_super_secret_assword $filename
done

ファイルにパイプされる出力は次のようになります。

Checking ../TheData/Project1999Data_1of7.Zip
+ 7z t '-pseeeecret' ../TheData/Project1999Data_1of7.Zip

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7Zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs Intel(R) Xeon(R) CPU E5-2470 0 @ 2.30GHz (206D7),ASM)

Scanning the drive for archives:
1 file, 632866983 bytes (604 MiB)

Testing archive: ../TheData/Project1999Data_1of7.Zip

ERRORS:
Headers Error

パイプなしで実行する場合、プログレスメーターがあります。アーカイブのテストは機能し、完全な抽出のスポットチェックも問題ないように思われるため、ヘッダーエラーは偽物だと思います。

現時点では、単にすべてのデータを抽出することはできず、ストレージ割り当ての変更要求プロセスを待機しています。

パスワードが一連のZipファイルで機能することを簡単に確認するためのより高速な方法はありますか?

これからリターンコードをキャプチャし、単純な合否をエコーアウトする方法はありますか? 7Zipにはいくつかのリターンコードが文書化されています

このスクリプトを変更して、チェックを並行して実行することは可能ですか? 7zは1つのコアの80%しか使用していないようで、I/Oバウンドであることを示しています。

T(テスト)関数またはl(リスト)関数のいずれを使用しても、7Zipのパフォーマンスに変化はないようです。

1
Freiheit

シェルエラー/終了コードを確認してください。

7Zipを実行してファイルを圧縮する(そしてパスワードで保護する)と、

echo "now that is what I call bubba" > bubba
7z a -psecret foo bubba
rm bubba #remove for convenience

7Zipを実行してアーカイブの内容を抽出/テストしようとすると、7Zipでエラーが発生します。

7z t -pnotsecret foo.7z
...
Extracting bubba    Data error in encrypted file. Wrong password?
...
Sub items Errors: 1

次に、シェルのエラーコードを確認できます。

echo $?
2

正しいパスワードを入力すると、

7z t -psecret foo.7z
...
Extracting bubba
...
Everything is Ok

次に、シェルのエラーコードを確認します。

echo $?
0

したがって、シェルエラー/終了コードを使用して正しいパスワードを確認するか、7zとgrep-iの出力をスキャンして「すべて問題ありません」と言うことができます。

これがスクリプトの改訂版です。

#!/bin/bash
set -x
for filename in ../TheData/*Data*of*.Zip; do
    #echo "Checking $filename"
    7z t -ple_super_secret_assword $filename
    if [ $? -eq 0 ]; then echo "ok: $filename"
    else echo "error: password failed $filename"
    fi
done
1
ChuckCottrill