我正在编写一个应用程序,它维护一个加密数据库,其中包含非常敏感的信息,包括加密密钥和密码。应用程序对使用 memlock、阻止 ptrace、防止 coredumps 等感到偏执,但有一个命令让数据库所有者编辑数据库的内容。此命令以人类可读的 ASCII 格式将整个数据库写入一个临时文件,并让用户对其进行编辑。具体来说,它在新创建的目录中创建一个新文件/tmp/XXXXXXXX/
(其中 /tmp 是理想的内存文件系统),然后在该文件上运行用户首选的编辑器。当编辑器退出时,应用程序解析文件内容并/tmp/XXXXXXXX/
在最终删除目录之前粉碎文件和其他任何内容。
不幸的是,这种策略不适用于任何 vi 变体,因为编辑器最终会将文件副本写入 /var/tmp/vi.recover,即使在 vi 删除它们之后,它们也可能会保留在磁盘上。(数据包含高价值的私钥,很容易搜索整个原始分区。)我正在寻找一种通用方法来抑制这些恢复文件,或者至少将它们移动到/tmp/XXXXXXXX/
.
我的理想解决方案适用于大多数 vi 变体,但我也很高兴解析EDITOR
环境变量并为每个编辑器做一些不同的事情。因此,如果您有一个适用于 vim 而不适用于其他人的解决方案,那至少是一个好的开始。(我已经使用特殊情况 vim 重新打开编辑器到解析错误的确切列号,而其他 vi 变体只能打开到适当的行。)
因为这是一个分发给其他人的应用程序,我不能做的一件事就是通过编辑人们的 .exrc 或 .vimrc 文件来解决问题。在绝对紧要关头,我想我可以在执行编辑器之前更改 HOME 环境变量并创建一个临时 .vimrc 将用户的真实版本与一些恢复抑制命令合并。但是,我更喜欢命令行或注释解决方案。
我能得出的最简单的工作示例是分享我为 emacs 所做的事情,即在文件末尾附加以下注释:
# Local Variables:
# make-backup-files: nil
# auto-save-default: nil
# End:
Run Code Online (Sandbox Code Playgroud)
尽管最简单的是命令行选项,但如果某些等效注释适用于 vim 或任何其他 vi 变体,那也很棒。
更新:
在对 strace 进行了一些实验后,似乎以下命令可以为 vim 做我想要的:
vim -n -c 'set viminfo=' /tmp/XXX/secret.ini
Run Code Online (Sandbox Code Playgroud)
但是,它不适用于--cmd
,这是建议的选项,但仅适用于-c
。此外,我真的不明白是什么-n
,但只是注意到手册页说它会破坏恢复。所以我仍然很想听听了解 vim 的人的回答,如果这确实有效的话。当然,其他 vi 变体的解决方案将受到欢迎。
更新2:
该EXINIT环境变量可能工作了vi和NVI,如果我将它设置为EXINIT=set dir=/tmp/XXX|set recdir=
。nvi 在启动时给出了缺乏恢复的警告,这是令人鼓舞的,而 vi 确实将文件放入文件系统中,但至少它们在 /tmp 中,这通常是一个内存文件系统。
set directory=/tmp/XXXXXXXX
Run Code Online (Sandbox Code Playgroud)
可以将其添加到单个实例的命令行中,如下所示
mkdir -m700 /tmp/xyz
vim --cmd "set directory=/tmp/xyz" /path/to/secure.file
Run Code Online (Sandbox Code Playgroud)