在linux中编辑只读系统文件时,应使用:w !sudo tee %强制保存,而非:wq!;可映射为:w!!提升效率,而dd或临时改权限等方式存在风险。

在 Linux 中用 vim 编辑只读文件(比如系统配置文件)时,普通 :wq 会报错 E45: 已设定选项 “readonly” 或 E212: 无法打开并写入文件。这不是操作错了,而是权限不足——你没写入权限,但内容已改好,不想重开 sudo vim 重做一遍。关键在于绕过 vim 的只读限制,用外部命令提权写入。
直接用 :w !sudo tee %
这是最常用、最稳妥的强制保存方式:
- 先按 Esc 确保回到命令模式
- 输入 :w !sudo tee %,然后回车
- 系统会提示输入当前用户密码(不是 root 密码),验证通过后即完成保存
- % 自动展开为当前文件路径,tee 把 vim 缓冲区内容通过 sudo 写回原文件
简化操作:映射成 :w!!
每次敲一长串太麻烦?可在 ~/.vimrc 中添加快捷映射:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 编辑
~/.vimrc,加入这行:cmap w!! w !sudo tee > /dev/null % - 保存后重启 vim(或执行
:source ~/.vimrc) - 之后只需输入 :w!! 回车,就能一键提权保存
-
> /dev/null是为了隐藏 tee 命令的标准输出,界面更干净
注意区分 :wq! 和 :w !sudo tee %
别混淆两者适用场景:
-
:wq! 只对“本用户拥有该文件但被 vim 设为 readonly”的情况有效(比如你用
:set ro手动设的),它不解决权限问题 - 如果文件属主是 root、权限是
-rw-r--r--,而你是普通用户,:wq! 依然失败,必须用 :w !sudo tee % - 错误提示里出现 E212 而不是 E45,基本就是权限不够,得走 sudo 路线
其他可行但需谨慎的方式
有些方法看似简单,实际有风险,慎用:
- :w !sudo dd of=%:也能写入,但 dd 对中断敏感,出错可能损坏文件
-
临时改权限再保存:如
chmod u+w filename→:wq→ 再改回去。但涉及多用户环境时,可能引发安全审计问题 - 退出后用 sudo tee 手动覆盖:不如 vim 内直接保存直观,且容易漏掉未保存的缓冲区内容










