必须用 sed -i.bak 修改系统配置文件,因为它在修改前瞬间生成备份文件,确保出错时可回滚;若仅用 -i 则无备份,误操作会导致原始配置永久丢失。

用 sed -i.bak 修改系统配置文件,核心就两点:安全地改、留得住原样。它不是“先备份再手动改”,而是一条命令完成“备份 + 覆盖写入”,且备份动作在修改前瞬间触发,哪怕改出错,.bak 文件也完好无损。
为什么必须用 -i.bak 而非单纯 -i
直接 sed -i 's/.../.../' /etc/selinux/config 会跳过备份,一旦替换逻辑写错(比如正则漏转义、多匹配了不该动的行),原始配置就永久丢失。而 -i.bak 强制生成 /etc/selinux/config.bak,相当于给系统配置上了一道保险栓。GNU sed(主流 Linux 发行版默认)支持这种写法;macOS/BSD 用户需写成 -i '' 或 -i.bak(带点),否则报错。
典型系统配置修改场景与写法
以下命令均以真实路径和常见需求为例,执行前建议先用不带 -i 的版本预览效果:
- 关闭 SELinux:
sudo sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config - 切换 Ubuntu 源为阿里云镜像:
sudo sed -i.bak 's|http://archive.ubuntu.com|https://mirrors.aliyun.com|g' /etc/apt/sources.list(注意用|替代/避免 URL 中斜杠冲突) - 注释掉某项内核参数(如
ipv6.disable=1):sudo sed -i.bak '/ipv6\.disable=/s/^/# /' /etc/default/grub(\.转义点号,^锚定行首) - 批量清理空行和纯注释行:
sudo sed -i.bak '/^$/d; /^#/d' /etc/hosts(用;串联多操作)
关键细节与避坑提醒
这些地方看似微小,却常导致误操作或备份失效:
-
.bak是后缀名,不是选项的一部分——写成-i .bak(中间有空格)会失败,必须连写为-i.bak - 备份文件只生成一次:若重复运行同一条
sed -i.bak命令,不会覆盖已有.bak,而是直接覆盖原文件,.bak仍保留首次备份内容 - 权限问题:修改
/etc下文件通常需sudo,但sudo sed -i.bak ...中的重定向由 shell 执行,sudo不作用于重定向本身;稳妥做法是加tee或确保整个命令在 root 权限下运行 - 行号类操作(如删第5–10行)同样适用备份:
sudo sed -i.bak '5,10d' /etc/sysctl.conf,备份的是删之前的完整文件
验证与回滚流程
改完别急着重启服务,按顺序确认:
- 检查备份是否存在:
ls -l /etc/selinux/config*应看到config和config.bak - 对比差异:
diff /etc/selinux/config.bak /etc/selinux/config确认只改了预期内容 - 语法校验(如 APT 源):
sudo apt update是否报错;如失败,立刻还原:sudo cp /etc/apt/sources.list.bak /etc/apt/sources.list
不复杂但容易忽略。只要养成 -i.bak 开头、diff 收尾的习惯,系统配置变更就稳了。











