在管道内创建 MD5,而不更改数据流

在管道内创建 MD5,而不更改数据流

我被要求创建一种机制,将(静态数据)加密的 mysql 转储到加密文件中。该机制必须满足某些标准,例如:

  • 应在Linux下运行
  • 不写入未加密的 SQL 数据,甚至不写入临时文件
  • 生成未加密转储流的 md5(或其他哈希值)
  • 由于只有 sh shell 可用,因此不使用进程替换

我需要这样的东西:

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 显示。这就是具有进程替换支持的 shell 在不具有/dev/fd/x.


¹ 除了 ksh 的早期版本外,该功能来自 80 年代中期,其中进程替换支持的条件是系统支持/dev/fd/x.其他一些 shell,例如 rc、zsh 最初(很久以前)仅使用临时名称管道。

答案2

无需进程替换,因此它可以在功能有限的 POSIX shell 中工作,您可以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从其输入读取,并写入其输出以及一个或多个其他文件。所以它会写入 gzip 以及>(md5sum >> dump.md5).

什么是>(md5sum >> dump.md5)?这是一个进程替换 - bash 启动命令md5sum >> dump.md5,为(在我的例子中为 63)选择一个备用文件描述符编号,将 的文件描述符 63tee连接到的输入,然后将进程替换替换为so看到命令并写入它的文件描述符 63(及其输出)。teemd5sum/dev/fd/63teetee /dev/fd/63

相关内容