Gru*_*k83 5 shell-script hashsum
我被要求创建一种机制,将(静态数据)加密的 mysql 转储到加密文件中。该机制必须满足某些标准,例如:
我需要这样的东西:
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  mysqldump | tee /dev/fd/3 | gzip | encryption-tool > dump.gz.enc\n} 3>&1 | md5sum >> dump.md5\nRun Code Online (Sandbox Code Playgroud)\n在没有 的系统上/dev/fd/x,请使用命名管道,如@ilkkachu 所示。这就是具有进程替换支持的 shell 在没有/dev/fd/x.
\xc2\xb9 除了早期版本的 ksh 之外,该功能来自 80 年代中期,其中进程替换支持的条件是系统支持/dev/fd/x. 其他一些 shell,例如 rc、zsh 最初(很久以前)仅使用临时名称管道。
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文件系统上创建任何临时文件或命名管道本身,从而确保它们仅驻留在内存中。
在 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