7

短版:回声“测试”| vim - | grep “好”

这不起作用,因为 vim 不会输出到管道。它说:“Vim:警告:输出不是终端”。有什么办法可以做到这一点?跨编辑器支持也会很好。

我试过命名管道,但 vim 不会打开它们。

长版:echo $passw | gpg -q -d --passphrase-fd 0 $文件名 | vim - | “gpg 以某种方式使用 $passw 对其进行加密并将其存储回 $filename”。

我正在尝试编辑一个 gpg 加密文件,但不想在任何时候将解密文件放在磁盘上。

完整的脚本在这里:https ://github.com/ptarjan/viencrypt

4

8 回答 8

7

请记住,默认情况下 Vim 会在磁盘上创建一个交换文件。使用以下命令启动 vim 以避免它:

vim "+set noswapfile"
于 2009-05-26T05:41:31.873 回答
5

你可以让 vim 为你加密它。

在将文件保存到 vim 之前,请通过 gpg 加密器过滤内容:

    :{range}![!]{filter} [!][arg] *:range!*
          通过外部程序过滤 {range} 行
          {筛选}。Vim 用
          最新给定的命令并附加可选的 [arg]。
          Vim 将 filter 命令的输出保存在
          临时文件,然后将文件读入
          缓冲。Vim 使用 'shellredir' 选项来重定向
          过滤器输出到临时文件。
          但是,如果 'shelltemp' 选项关闭,则管道
          尽可能使用(在 Unix 上)。
          当 'R' 标志包含在 'cpoptions' 标记中时
          过滤的行被删除,除非
          |:标记| 使用命令。示例:>
            :keepmarks '<,'>!sort
    <            
          当过滤后的行数小于
          之前,无论如何都会删除缺失行中的标记。
        w

所以,如果你想通过 gpg 过滤它(我猜这里的标志):

:%!gpg -q -d -p $password
:w $filename

如果您想在 vim 中使用它们,您需要导出$password$filename环境变量,以便 vim 可以访问它们。

于 2009-05-26T02:32:04.443 回答
3

您可以在某处安装一个 tmpfs 文件系统(将数据存储在内存中)并在那里完成您的工作。

编辑(!):对不起,做那个ramfs。不同之处在于 tmpfs 可以被调出交换空间,这是您不想要的。或者,您可以关闭所有交换设备(使用 swapoff)并使用 tmpfs。

于 2009-05-26T00:29:30.790 回答
2

另一种选择是为 Vim 使用gnupg插件,而不是重新发明轮子。:) 当然,我有点偏见,因为我是插件的当前维护者。

于 2012-05-31T05:21:47.453 回答
1

这是正确的:Vim 不会输出到管道。Vim 不会将其输入输出到管道,而是将其输出到编辑器窗口中,您可以在其中编辑它。您无法在 vim 之后继续管道序列。所以试试:

回声 $passw | gpg -q -d --passphrase-fd 0 $文件名 | vim -

或者根本不使用 vim。

如果您想在传回 gpg 之前编辑文件,则必须分两步进行。

于 2009-05-26T00:35:00.047 回答
1

您可以使用该%p命令将正在编辑的文件打印到标准输出。

在本例中,Vim 读取其标准输入并将其发送到标准输出:

$ (echo one; echo two; echo three; echo four) | \
  vim - -nes -u NONE  -c ':%p' -c ':q!' | \
  tail -n +2 | \
  grep t
two
three

笔记:

  • vim -: 从标准输入读取
  • -n:不创建交换文件,只使用内存
  • -e: 以 ex 模式启动
  • -s:静默或批处理模式
  • -u NONE: 不要阅读.vimrc(如果你想.vimrc被阅读,跳过这个选项。但是不同的人有不同的.vimrc-s,所以如果你不写-u NONE,你的代码可能不适用于不同的人,甚至对你来说,如果你改变你的.vimrc。)
  • -c <something>: 作为命令运行某些东西
  • -c ':%p': 将缓冲区的内容打印到标准输出
  • -c 'q!': 不保存直接退出
  • tail -n +2: 扔掉 Vim 输出的第一行(也就是 ' Vim: Reading from stdin...' 行)

在下面的例子中,Vim 实际上做了一些有用的事情:它删除了标准输入的第一列。

$ (echo one; echo two; echo three; echo four) | \
  vim - -nes -u NONE  -c ':exec "normal G\<c-v>ggx"' -c ':%p' -c ':q!' | \
  tail -n +2
ne
wo
hree
our

笔记:

  • :exec:执行以下命令(命令行命令,非普通模式命令)
  • normal:执行给定正常模式命令的命令行命令
  • G: 转到文件的最后一行
  • \<c-v>: 开始块选择
  • gg: 转到第一行
  • x: 删除选中的字符

编辑:

我可以在交互式会话中的 ":wq" 之后立即告诉 vim 发出 ":%p" 吗?

你可以告诉 Vim 诸如“退出前运行命令 X”之类的事情,例如使用 VimLeave 自动命令(参见:help autocommand, :help VimLeave):

$ (echo "line 1"; echo "line 2") | \
  vim - -nes -u NONE -c ':autocmd VimLeave * :%p'
Vim: Reading from stdin...
:q!        # you type :q!
line 1
line 2

问题出在“:%p”命令上。如果您使用“-e”参数,您将无法获得可视化编辑器。如果你不使用 "-e",Vim 不会将 ":%p" 的结果打印到标准输出,而是打印到终端。

我将在另一篇文章中提出不同的建议。

于 2009-05-26T06:04:58.880 回答
1

原始问题的解决方案(据我所知):

secret.txt包含加密的文本。

./encode.sh是对称编码器脚本。

以下命令将从 secret.txt 中读取文本,解码,使其在 Vim 中可编辑,编码,然后将其写回 secret.txt:

$ cp secret.txt | \
  ./encode.sh | \
  vim - -n -u NONE \
      -c ':autocmd VimLeave * :exec "%!./encode.sh" | write! tmp'; \
  mv tmp secret.txt

笔记:

  • :autocmd VimLeave * <command>:<command>在离开 Vim 之前执行任何文件
  • :exec "%!./encode.sh" | write! secret.txt:./encode.sh将缓冲区的全部内容作为过滤器运行,然后将缓冲区写入secret.txt
  • “作为过滤器”意味着缓冲区的内容将被送入 ./encode.sh. 缓冲区的内容将在./encode.sh执行完成后被标准输出替换。

但我不得不说,这个解决方案是丑陋的。我会推荐与 rampion 相同的方法:查看提到的自动命令 ( :help autocommand) 并尝试在 Vim 中完成整个编辑过程。

最后附注:Vim 有自己的加密命令,它完全按照您在项目网页上的描述:“它只是将文件解密为只有您可读的文件,您在您最喜欢的编辑器中编辑它,然后重新加密它并将文件保存回它的来源。”

Vim 帮助 ( :help :X) 说明了该算法:

  • 使用的算法是可破解的。一个 4 个字符的密钥在大约一小时内,一个 6 个字符的密钥在一天内(在 Pentium 133 PC 上)。这要求您知道一些必须出现在文件中的文本。专家可以用任何键破解它。当文本被解密后,这也意味着密钥可以被泄露,其他使用相同密钥加密的文件也可以被解密。
  • Pkzip 使用相同的加密,美国政府不反对其出口。Pkzip 的公共文件 APPNOTE.TXT 详细描述了这个算法。
于 2009-05-26T21:30:08.123 回答
0

你不能对 root 用户隐藏任何东西,即使是在内存中(他们可以访问 /dev/mem)。这是无法回避的事实。

所以我只使用你的主目录中的临时文件,除了root之外,它应该受到保护。在一行中,输入:

echo "testing" >~/proc$$ ; vim ~/proc$$ ;
    grep "good" ~/proc$$ ; rm -f ~/proc$$

如果您想要真正的安全性,请将文件移动到您是唯一 root 用户的框中并在那里执行。然后将加密文件移回。

于 2009-05-26T00:34:29.000 回答