データフローを変更せずにパイプライン内にMD5を作成する

データフローを変更せずにパイプライン内にMD5を作成する

暗号化されたmysql(未使用データ)を暗号化されたファイルにダンプするメカニズムを生成するように求められました。メカニズムは、次の特定の基準を満たす必要があります。

  • Linuxで実行する必要がある
  • 暗号化されていないSQLデータは一時ファイルにも書き込まれません。
  • 暗号化されていないダンプストリームのmd5(または他のハッシュ)の生成
  • sh シェルのみ使用可能なため、プロセス置換は使用しない

次のようなものが必要です。

mysqldump | md5-tool >> dump.md5 | gzip | encryption-tool

私の問題は、私が見つけたすべてのハッシュツールがストリームを送信せずにチェックサムのみを送信することです。最も近いツールは-pこのオプションを含むBSD md5ですが、Linuxでは利用できません。

これを行うためのツールを知っている人はいますか?

答え1

標準構文で実行する必要がありますshが、使用しているシステムがそれをサポートしている場合は、/dev/fd/x手動でプロセス置換を実行できます。

{
  mysqldump | tee /dev/fd/3 | gzip | encryption-tool > dump.gz.enc
} 3>&1 | md5sum >> dump.md5

ないシステムでは、名前付き/dev/fd/xパイプを次のように使用します。@ilkkachuさんが表示しました。これは、プロセス交換サポートを備えたシェルです/dev/fd/x


¹kshの初期バージョンを除いて、この機能は、プロセス交換サポートがシステムサポートに基づいて条件付きであった80年代半ばから提供されました/dev/fd/x。 rc、zshなどの他の一部のシェルは、元の(古い)一時的な名前パイプのみを使用していました。

答え2

プロセスの置き換えは不要なため、機能は制限されたPOSIXシェルで機能し、名前付きteeパイプで使用できます。md5sumバックグラウンドで手動で起動するだけです。

mkfifo -m 600 p || exit
md5sum < p >> dump.md5 &
mysqldump | tee p | gzip | encrypt > final.backup
rm -f p
wait "$!" # make sure md5sum has finished computing the checksum and
          # written it before carrying on with the rest of the script.

名前付きパイプに名前ファイルシステムでは、ファイルはディスクだけでなくファイルシステムにも移動しないため、通常のパイプのように機能する必要があります。ただし、データベース自体が暗号化されていない限り、ディスクに残っているバックアップコピーは重要ではありません。もちろん、tmpfsファイルシステムに一時ファイルまたは名前付きパイプ自体を作成して、メモリにのみ常駐させることもできます。

答え3

Bashでは、次のものを使用できますteeプロセスの交換:

mysqldump | tee >(md5sum >> dump.md5) | gzip | encryption-tool

tee入力から読み込み、出力と1つ以上の他のファイルを書き込みます。したがって、gzipも作成します>(md5sum >> dump.md5)

何ですか>(md5sum >> dump.md5)?これはプロセスの置き換えです。 bash startコマンドmd5sum >> dump.md5、代替ファイル記述子番号(私の場合は63)を選択し、teeファイル記述子63を入力に接続してから、プロセス置換を次に置き換えます。したがって、コマンドを参照して対応するファイル記述子63に書き込みます(およびその出力)。teemd5sum/dev/fd/63teetee /dev/fd/63

関連情報