为何使用Vim无法编辑sudoers.d目录下的文件但Nano可以?
嗨,这个问题其实挺常见的,我来帮你拆解下背后的原因,顺便给你解决办法:
文件权限触发Vim的只读模式
/etc/sudoers.d/下面的文件默认权限一般是-r--r-----(也就是440),只有root能读,其他用户碰都碰不到。当你用sudo vi打开这类文件时,Vim会检测到文件本身是只读权限,默认就切换到了只读模式。这时候如果你直接敲:w保存,Vim会直接拒绝,导致你以为编辑的内容丢了;但Nano不一样,它不会因为文件的原始只读权限就卡你——毕竟你是通过sudo以root身份运行的,实际有写入权限,Nano会直接帮你完成保存。解决起来很简单:在Vim里编辑完后,用强制保存命令
:w!就能正常把修改存进去了。Vim的swap文件创建受阻
还有一种可能:如果你是在普通用户的目录下(比如vagrant用户的/home/vagrant)执行sudo vi命令,Vim会尝试在当前目录创建swap临时文件,用来存编辑过程中的临时内容。虽然root理论上能写任何目录,但如果当前目录的权限设得很严(比如vagrant家目录是700权限),Vim可能因为配置细节没法创建swap文件,然后自动切到只读模式。而Nano不需要依赖swap文件来编辑,所以完全不受这个影响。你可以试试这几个办法:要么先切到root的家目录(
cd /root)再开Vim,要么在Vim里临时禁用swap文件(输入:set noswapfile),或者改下Vim配置让swap文件存在root有权限的目录里。visudo的特殊作用
你提到sudo visudo能正常用,这是因为visudo是专门为编辑sudoers文件做的工具:它会自动锁定文件防止多人同时改,还会在保存前检查语法,避免你写错配置导致sudo直接失效。直接用vi或者nano编辑就没这些防护,所以官方其实更推荐用visudo来改sudoers相关文件——要是你习惯用Vim,也可以通过EDITOR=vim sudo visudo来让visudo调用Vim作为编辑器,既保留Vim的操作习惯,又有visudo的语法检查。
备注:内容来源于stack exchange,提问作者George Udosen

