我被要求创建一种机制,将(静态数据)加密的 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(及其输出)。tee
md5sum
/dev/fd/63
tee
tee /dev/fd/63