如何在编辑期间将文件保留在内存中?

时间:2009-05-26 00:24:04

标签: bash vim gnupg

简短版:echo“testing”| vim - | grep“好”

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

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

长版:echo $ passw | gpg -q -d --passphrase-fd 0 $ filename | vim - | “不知何故,gpg使用$ passw对其进行加密并将其存储在$ filename中。”

我正在尝试编辑gpg加密文件,但希望在任何时候都不要将解密文件放在磁盘上。

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

8 个答案:

答案 0 :(得分:7)

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

vim "+set noswapfile"

答案 1 :(得分:5)

你可以让vim为你加密。

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

    :{range}![!]{filter} [!][arg]               *:range!*
          Filter {range} lines through the external program
          {filter}.  Vim replaces the optional bangs with the
          latest given command and appends the optional [arg].
          Vim saves the output of the filter command in a
          temporary file and then reads the file into the
          buffer.  Vim uses the 'shellredir' option to redirect
          the filter output to the temporary file.
          However, if the 'shelltemp' option is off then pipes
          are used when possible (on Unix).
          When the 'R' flag is included in 'cpoptions' marks in
          the filtered lines are deleted, unless the
          |:keepmarks| command is used.  Example: >
            :keepmarks '<,'>!sort
    <            
          When the number of lines after filtering is less than
          before, marks in the missing lines are deleted anyway.
        w 

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

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

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

答案 2 :(得分:3)

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

编辑(!):抱歉,让那个ramfs。区别在于tmpfs可以分页到交换空间,这是你不想要的。或者,您可以关闭所有交换设备(使用swapoff)并使用tmpfs。

答案 3 :(得分:1)

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

echo $ passw | gpg -q -d --passphrase-fd 0 $ filename | vim -

或者根本不使用vim。

如果要在传回gpg之前编辑文件,则必须分两步完成。

答案 4 :(得分: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:删除所选字符

编辑:

  

我可以告诉vim在交互式会话中“:wq”之后发出“:%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”到标准输出但是到终端。

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

答案 5 :(得分: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>:在将Vim留在任何文件
  • 之前执行<command>
  • :exec "%!./encode.sh" | write! secret.txt:整体上运行./encode.sh 将缓冲区的内容作为过滤器,然后将缓冲区写入secret.txt
  • “作为过滤器”意味着将输入缓冲区的内容 ./encode.sh。缓冲区的内容将替换为标准 完成执行后./encode.sh的输出。

但我不得不说,这个解决方案很丑陋。我建议the same as rampion:查看提到的自动命令(:help autocommand)并尝试在Vim中完成整个编辑过程。

最后请注意:Vim有自己的加密命令,它完全符合您在project web page上所描述的内容:“它只是将文件解密为只有您可读的文件,您可以在自己喜欢的编辑器中编辑它,然后它重新加密 它将文件保存回原来的位置。“

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

  
      
  • 使用的算法是易碎的。一个小时的密钥,大约一个小时,一个6   一天内的字符键(在Pentium 133 PC上)。这要求你知道   一些必须出现在文件中的文本。专家可以为任何密钥打破它。   当文本被解密时,这也意味着密钥可以   透露,用同一密钥加密的其他文件可以解密。
  •   
  • Pkzip使用相同的加密,美国政府不反对其出口。   Pkzip的公共文件APPNOTE.TXT详细描述了这个算法。
  •   

答案 6 :(得分:1)

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

答案 7 :(得分:0)

您无法隐藏root用户的任何内容,即使在内存中也是如此(他们可以访问/ dev / mem)。这是一个无法避免的事实。

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

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

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