最常用且稳妥的强制保存方法是:w !sudo tee %,它通过管道将缓冲区内容交由sudo权限的tee命令写入原文件,%自动展开为当前路径,输入密码后即可完成保存,无需退出重开。

在 Vim 中以普通用户打开一个只有 root 权限才能写入的文件(比如 /etc/hosts),编辑完却无法保存时,不用退出重开、也不用重新编辑,可以直接用 :w !sudo tee % 命令完成强制保存。
核心命令::w !sudo tee %
这是最常用也最稳妥的方式。它不是让 Vim 自己去写文件,而是把当前缓冲区内容通过管道交给 sudo tee 执行写入,相当于“借 root 权限替你落盘”。
-
输入方式:先按
Esc确保进入命令模式,然后输入:w !sudo tee %,回车 -
% 的作用:自动展开为当前文件的完整路径(如
/etc/hosts),无需手动输入 - 执行后提示:会要求你输入当前用户的 sudo 密码;输完后,tee 会把内容写入原文件,并在 Vim 中显示写入字节数
- 后续操作:Vim 可能提示 “File has changed since last read; reload?”,此时输入 O(大写字母 O,表示 overwrite)即可继续编辑,或输入 L(load)刷新视图
简化操作:自定义 w!! 快捷命令
每次敲一长串太麻烦?可以把它映射成简短命令,加到你的 ~/.vimrc 中:
保存配置后重启 Vim(或执行 :source ~/.vimrc),之后只需输入 :w!! 回车,就能一键触发 sudo 保存。
-
> /dev/null是为了隐藏 tee 输出的冗余信息,界面更干净 - 注意是
cmap(命令行模式映射),不是nmap;只对冒号命令生效
为什么不用 :w! 或 :wq!?
这些命令只能绕过 Vim 内部的只读标记(比如你手动设置了 :set readonly),但对系统级权限(如文件属主是 root、当前用户无写权限)完全无效。遇到 E212: Can't open file for writing 错误时,:w! 依然会失败——它不提权,只是“强行覆盖警告”,不是“强行突破权限”。
其他可行但不推荐的方式
- 另存为临时文件再 sudo mv:`:w /tmp/myconf.tmp` → 退出 → `sudo mv /tmp/myconf.tmp /etc/hosts`。步骤多、易出错,且丢失 Vim 缓冲状态
- 退出后 sudo vim 重开:最安全但最折腾,尤其改了几十行后还得重来
- chmod/chown 修改文件权限:仅适用于你有权限改目录或上级策略允许的情况,生产环境通常禁止随意改系统文件权限











