应限制root权限并实施最小权限原则:用sudo白名单授权特定命令,禁用sudo su,关键文件用chattr +i/+a防护,批量操作前强制预览,脚本启用set -euo pipefail。

用 sudo 代替直接切 root,并限制命令白名单
直接 su - 或长期以 root 身份操作,极易误删关键文件或改错配置。更稳妥的做法是让普通用户通过 sudo 执行特定命令,且只开放必要权限。
- 编辑
/etc/sudoers时务必用sudo visudo(防止语法错误锁死 sudo) - 按需授权,例如只允许重启服务:
%admin ALL=(ALL) NOPASSWD: /bin/systemctl restart nginx - 禁用
sudo su或sudo -i,避免绕过命令粒度控制 - 启用
requiretty(默认开启)可阻止后台脚本意外获得 root 权限
关键目录加 chattr +a 或 +i 防误覆盖/删除
有些路径几乎不该被直接写入,比如 /etc/passwd、/boot/grub2/grub.cfg、日志归档目录。用 chattr 加不可变属性比依赖人手小心更可靠。
-
chattr +i /etc/shadow:彻底禁止修改(连 root 也不能,需先-i才能更新密码) -
chattr +a /var/log/audit/:只允许追加,防止日志被清空或覆盖 - 注意:
+i会阻断所有系统自动更新(如passwd命令),仅适用于静态配置或离线维护场景 - 定期检查:
lsattr /etc/* | grep '\-\-i\-\-'确认关键文件未被意外解除保护
批量操作前强制预览,别信 rm -rf * 的直觉
Shell 展开逻辑和当前路径状态稍有偏差,rm -rf * 或 find . -name "*.log" -delete 就可能删掉不该动的目录。必须把“执行”和“预览”拆成两步。
- 用
echo模拟命令:echo rm -rf /path/to/*,再确认 glob 展开结果 -
find类操作先不加-delete,换成-print或-ls看匹配项 - 对重要目录启用
alias rm='rm -I'(大写 i,删除 3 个以上文件时强制确认) - 永远不在
/、/usr、/etc下直接运行未验证的for循环或xargs
用 set -u 和 set -e 给运维脚本加保险
人工执行命令出错还能 Ctrl+C,但脚本一旦跑偏就可能连锁破坏。尤其当变量未定义或上条命令失败却继续执行时,后果更隐蔽。
- 脚本开头加
set -euo pipefail:未定义变量报错、任一命令失败退出、管道任一环节失败即停 - 临时绕过用
set +u,但必须立刻恢复,且加注释说明原因 - 敏感操作前加判断:
[ -d "/data/backup" ] || { echo "backup dir missing"; exit 1; } - 不要依赖
$?手动检查——set -e已覆盖大部分场景,额外检查反而易出错
真正难防的不是错敲一个字母,而是连续几步都“看起来合理”的操作链——比如先 cd .. 再 rm -rf data,而当前目录其实在 /home 根下。自动化防护和最小权限原则不能替代现场专注,但能拦住绝大多数“顺手一敲”的瞬间。










