【问题标题】:Get Input for a bash script by capturing it from a VIM session通过从 VIM 会话中捕获 bash 脚本来获取输入
【发布时间】:2013-01-08 14:52:21
【问题描述】:

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

app new entry

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

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

【问题讨论】:

  • 不确定我是否得到了问题。也许vim.wikia.com/wiki/User_input_from_a_script
  • @lucapette:我已经编辑了这个问题。我希望这能澄清我打算做什么。
  • 为什么要避免使用临时文件?这没什么不好的......
  • @eckes:我想知道是否有一种方法可以“虚拟”在系统内存中创建文件。我正在使用红宝石,如果这有帮助的话。原因是用户将提供一些我希望仅在信息加密后才将其写入磁盘的敏感信息。这是一个正当的借口,还是我在这里偏执?
  • 您可以通过全盘加密降低物理恢复的风险。在虚拟化服务器环境中,这不是通常考虑的措施(但在管理程序被破坏时仍然很有价值)。或者,挂载一个 ramdisk 并将临时文件放在上面。现在操作系统将其视为文件系统,但将其存储在 RAM 中。

标签: ruby vim


【解决方案1】:

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

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

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

就是这样。

【讨论】:

  • 好的,但他会怎么做呢?就是这个问题。
  • @eckes:正如我在问题后面的 cmets 中所描述的那样,我宁愿不这样做,除非这是唯一的方法。
【解决方案2】:

您可以让 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 完成,因此如果不需要来自second-script 的信息(很难从那里获取),您可以在vim 命令之后继续执行脚本。
  6. 将从子shell 启动第二个脚本。因此,在vim 调用之后运行的代码中不会看到任何变量修改。
  7. 第二个脚本将接收 vim 在标准输入上保存的任何内容。不能直接访问父标准输入,但使用 </dev/tty 可能会起作用。

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

【讨论】:

    【解决方案3】:

    为此使用 vim 似乎有点过头了。

    highline ruby​​ gem 可以满足您的需求:

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

    echo设置为false时不显示用户的文字。

    这也比创建一个文件然后删除它更安全,因为你必须确保删除是安全的(用随机数据覆盖文件几次,这样它就无法恢复;参见@987654325 @ 或 srm 实用程序)。

    【讨论】:

    • 与使用 vim 相比,使用 Ruby gem 有什么好处?每台机器都有 vim。
    • @ArturSapek 我认为你误会了。我并不是说仅仅使用 vim 是多余的。我也不是说它是矫枉过正,因为有人需要安装它(让我们甚至不开始使用 Windows)。我说这是矫枉过正,因为让 vim 做 OP 要求的事情很复杂。似乎是一个方钉圆孔解决方案。考虑其他答案中的步骤数和可能的安全漏洞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2011-04-24
    相关资源
    最近更新 更多