0

我正在创建一个新的 CLI 应用程序,我想从用户那里获得一些敏感的输入。因为,这个输入可能非常具有描述性,而且信息有点敏感,我想让用户从这个应用程序输入这样的命令:

app new entry

之后,我想为用户提供一个 VIM 会话,他可以在其中编写此描述性输入,当他退出此 VIM 会话时,它将被我的脚本捕获并用于进一步处理。

有人可以告诉我一种方法(可能是一些隐藏的 VIM 功能 - 因为,我总是对它们感到惊讶)以便我可以这样做,而无需创建任何临时文件?正如下面评论中所解释的,我更喜欢内存中的文件,因为信息可能有点敏感,因此,我想先通过我的脚本处理它,然后只将它写入磁盘一种加密方式。

4

3 回答 3

6

Git 实际上是这样做的:当你输入 时git commit,会创建一个新的 Vim 实例,并在这个实例中使用一个临时文件。在那个文件中,你输入你的提交信息

一旦 Vim 再次关闭,临时文件的内容就会被 Git 读取和使用。之后,临时文件再次被删除。

所以,要得到你想要的,你需要以下步骤:

而已。

于 2013-01-08T15:39:12.517 回答
1

您可以让 shell 创建附加到您的函数的文件描述符并让 vim 在那里写入,如下所示:(但您需要将脚本分成两部分:一个调用 vim,另一个处理其输入):

# First script
…
vim --cmd $'aug ScriptForbidReading\nau BufReadCmd /proc/self/fd/* :' --cmd 'aug END' >(second-script)

. 笔记:

  1. second-script实际上可能是第一个脚本中定义的函数(至少在 zsh 中)。这也需要 bash 或 zsh(仅在后者上测试)。
  2. 需要 *nix,可能不适用于某些被认为是 *nix 的操作系统。
  3. BufReadCmd需要,因为 vim 在尝试读取只写描述符时挂起。
  4. 建议您立即设置文件类型(如果需要),而不使用 ftdetect 插件:以防您的脚本不是唯一使用此方法的脚本。
  5. Zsh 将等待second-script完成,因此您可以在 vim 命令之后继续执行脚本,以防second-script不需要来自那里的信息(很难从那里获得)。
  6. 第二个脚本将从子shell 启动。vim因此,在调用后运行的代码中不会看到任何变量修改。
  7. 第二个脚本将接收 vim 在标准输入上保存的任何内容。父标准输入不能直接访问,但使用</dev/tty可能会起作用。

这适用于 zsh/bash 脚本。没有什么能真正阻止您在 ruby​​ 中使用相同的想法(它可能更方便并且不需要拆分为两个脚本),但我对 ruby​​ 的了解不足以说明如何在 ruby​​ 中创建文件描述符。

于 2013-01-08T20:59:27.803 回答
0

为此使用 vim 似乎有点矫枉过正。

highline红宝石宝石可能会满足您的需求:

require 'highline'
irb> pw = HighLine.new.ask('info: ') {|q| q.echo = false }
info: 
=> "abc"

当您设置echo为时,不会显示用户的文本false

这也比创建文件然后删除它更安全,因为您必须确保删除是安全的(用随机数据多次覆盖文件,使其无法恢复;请参阅shredsrm实用程序)。

于 2013-03-11T02:46:59.263 回答