如何在“私人模式”下启动vim

19
现代浏览器有一个称为“隐私模式”或“无痕模式”的功能。我想在vim中实现相同的功能,即以一种不留下任何活动痕迹的方式运行vim。这样,我就可以使用vim打开包含敏感信息的加密卷文件,而不必担心任何信息会泄露。
以下是我目前所做的:
alias vim_private="vim -i NONE --cmd 'set noswapfile' --cmd 'set nobackup'"

这些都在我的 .bashrc 文件中。

  • -i NONE 是为了避免文件名和寄存器内容通过 .viminfo 泄露出来
  • --cmd 'set noswapfile' 是为了防止创建交换文件
  • --cmd 'set nobackup' 是为了避免备份文件

还有其他需要注意的吗?Vim 还有哪些可能泄露信息的方式吗?


1
我相信你很好:-i -NONEcompatible模式启动,因此您应该没有历史记录或viminfo。 - romainl
1
确保的话,您也可以添加-u NONE -U NONE。您是否还需要让Vim访问的文件保留它们的最后访问/修改日期? - Daan Bakker
1
当一个人错误地在终端中直接输入密码/密码短语并希望清除$HISTFILE而不将敏感数据移动到.viminfo时,这非常有用。顺便问一下,这是vim存储痕迹的唯一位置(加上swp文件)吗? - tuxayo
1
建议的别名名称:vimcognito - lindhe
2个回答

6
您的设置看起来很好。我不确定当您将Vim作为vi调用时是否会加载插件,但是一些插件(例如提供MRU功能)也会存储信息(通常在~/.vim...文件中)。通过--noplugin可以避免它们的加载。
此外,对于偏执狂者,$VIMINIT:set exrc:set modeline可能会导致执行Vimscript代码;这可能会(重新)启用涉及隐私的选项。

那么完整的防护模式是什么?添加 --noplugin,清除 $VIMINIT,并执行 :set noexrc 和 :set nomodeline 命令。 - tuxayo
1
@tuxayo: "full tinfoil" 会编译自己的精简版 Vim(vi?),它不会读取任何 RC 文件,并且还禁用了 :!system() 和相关命令。 - Ingo Karkat
2
我在vim 8.1中进行了测试,当我使用-u DEFAULTS -U DEFAULTS来使用默认的vim设置而不使用用户文件时,$VIMINIT没有效果。并且noexrcnobackup是默认设置。因此,:set noexrc和清除$VIMINIT是不必要的。我认为只需要在上面添加一个额外的--cmd 'set nomodeline'即可。我的版本是vim -i NONE -u DEFAULTS -U DEFAULTS -n -c 'set nomodeline'-c == --cmd-n表示不使用交换文件;-u DEFAULTS也不会加载插件)。 - Johnny Wong

0

根据您在vimrc文件中设置的命令,OP提供的别名可能无法正常工作。这是因为--cmd在加载vimrc文件之前运行命令,因此您的vimrc文件可能会覆盖这些值。相反,您可以使用-c,它与--cmd相同,但在加载vimrc文件后执行。

由于vimrc中有许多选项可能会泄漏数据,因此最好使用不同的方法。

使用默认vimrc文件使用vim

如上所建议,另一种选择是使用别名以默认rc文件加载vim:

HISTCONTROL=ignoredups:ignorespace # don't store commands that start with space to the history file
alias pvim_default=' vim -u DEFAULTS -U DEFAULTS -i NONE -n -c "set nomodeline"'

我们可以设置bash的HISTCONTROL变量为ignorespace选项,这样任何以空格前缀的命令都不会保存到bash历史文件中。在zsh中,请使用setopt HIST_IGNORE_SPACE代替。

使用自己的vimrc文件加载vim

如果你仍然想加载你的vimrc,一个更灵活的选择是将自定义变量g:PrivateMode传递给vim,你可以使用它来根据需要配置你的vimrc文件。

HISTCONTROL=ignoredups:ignorespace # don't store commands that start with space to the history file
alias pvim=' vim --noplugin --cmd "let g:PrivateMode=1"'

然后在你的vimrc中使用

" Don't use private mode if g:PrivateMode is not set from the command line
" Put near start of vimrc file
if !exists("g:PrivateMode")
    g:PrivateMode = 0
endif


" Put this near the end of your vimrc file so values don't get overwritten by accident
if g:PrivateMode
    set nobackup
    set noundofile
    set noswapfile
    set viminfofile=NONE
    set viminfo=
    set nomodeline
    set noexrc " dont load .vimrc, .exrc, .gvimrc found in the current directory
    set clipboard^=exclude: " make sure vim isn't saving to system clipboard
else
    " setup for non-private mode
endif

你需要检查一下你的vimrc文件,看看是否有任何命令、插件等可能会泄露数据并在私密模式下禁用它们。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接