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

Gru*_*k83 5 shell-script hashsum

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

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

我需要这样的东西:

mysqldump | md5-tool >> dump.md5 | gzip | encryption-tool
Run Code Online (Sandbox Code Playgroud)

我的问题是,我找到的所有哈希工具都不传输流,而只传输校验和。最接近的工具是带有该-p选项的 BSD md5,但在 Linux 上不可用。

有谁知道可以完成此任务的工具吗?

Sté*_*las 13

如果必须以标准sh语法完成,但您使用的系统支持/dev/fd/x,则可以手动进行进程替换:

\n
{\n  mysqldump | tee /dev/fd/3 | gzip | encryption-tool > dump.gz.enc\n} 3>&1 | md5sum >> dump.md5\n
Run Code Online (Sandbox Code Playgroud)\n

在没有 的系统上/dev/fd/x,请使用命名管道,如@ilkkachu 所示。这就是具有进程替换支持的 shell 在没有/dev/fd/x.

\n
\n

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

\n


ilk*_*chu 11

无需进程替换,因此它可以在功能有限的 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.
Run Code Online (Sandbox Code Playgroud)

尽管命名管道在文件系统中有名称但它应该像常规管道一样工作,因为文件不会进入文件系统,更不用说磁盘了。不过,除非您的数据库本身已加密,否则磁盘上的杂散备份副本的残留物并不重要。当然,您可以在tmpfs文件系统上创建任何临时文件或命名管道本身,从而确保它们仅驻留在内存中。

  • @roaima,当然,如果你关心这样的东西,你的交换也被加密了;) (2认同)

use*_*751 9

在 Bash 中,您可以使用tee处理替换

mysqldump | tee >(md5sum >> dump.md5) | gzip | encryption-tool
Run Code Online (Sandbox Code Playgroud)

tee从其输入读取,并写入其输出以及一个或多个其他文件。所以它会写入 gzip 以及>(md5sum >> dump.md5).

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

  • 但对于任何不受这些限制约束的人来说仍然是一个有用的解决方案,并且很好地说明了如何使用流程替换+1 (9认同)