1. 你真的需要“管制”你的 Linux 账号吗?
在开始之前,我想先问一个问题:你手头的 Linux 机器,是不是还在用 root 账号干所有事?如果是,那这篇内容就是为你写的。
账号和权限管理,说白了就两件事:让该进来的人能顺畅进来,让不该动的东西谁都动不了。很多新手觉得这是运维才需要关心的东西,自己拿 Linux 当开发机用,或者就是搭个私人服务器,没必要搞那么复杂。但实际上,权限管理从来不是“管别人”,而是“保护自己”。我见过太多把开发机当玩具使的情况:顺手 chmod 777、直接用 root 跑服务、一个账号全家用——结果就是某天系统被入侵,或者手滑删了关键配置文件,找谁哭去。
这篇博文不打算给你堆砌网上能搜到的那种命令字典,而是想从一个实际使用者、踩过无数坑的老运维的角度,把 Linux 账号和权限管理这件事彻底讲透——从账号模型怎么设计,到用户组怎么划分,再到文件权限、特殊权限位、sudo 提权、ACL 等这些核心机制,掰开揉碎了告诉你每一个设计背后的逻辑,以及在实际操作中哪些地方最容易栽跟头。我还为你准备了一整套可以直接照抄的命令实操示例,换台机器照着跑一遍就能上手。
这篇内容适合这几类人看:刚接触 Linux 想系统入门的新手、在 Linux 环境下做开发想搞清楚环境隔离和部署安全的开发者,以及正在准备运维和系统管理面试的求职者。内容可能有那么一点长,但我保证没有一句废话。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 账号与组的设计思路:先理清“谁能干什么”
Linux 的多用户设计,核心思想就四个字——权限隔离。每个用户都是一个独立的“主体”,系统通过账号来识别你,再根据账号的身份授予不同的操作权限。
2.1 账号类型与 UID 的那些门道
Linux 账号分三种类型,每种的作用完全不同:
- 超级用户(root):UID 为 0,拥有系统一切权限。这个概念很好理解,就是系统里的“老板”,什么都说了算。
- 系统用户(UID 1~999):这类账号一般给服务进程用,不分配给真人登录。比如 nginx、mysql、sshd,在安装服务时通常会自带这类账号。它们通常没有 shell,也没有家目录,目的是让进程运行在低权限环境下,减少被攻破后的危害。
- 普通用户(UID 1000+):给真实用户使用,比如你的开发账号。
关于 UID,有一点值得多说两句。很多发行版把系统用户的上限设为 999,普通用户从 1000 开始,但这并不是绝对的。CentOS 6 之前是 499/500 的划分,有些定制系统也完全不同。如果你在写脚本时需要判断用户类型,建议直接用 id -u 拿 UID 判断,而不是写死某个数值。
2.2 用户组为什么重要?为什么不能把用户都塞进 root 组
你也许会问:既然有用户,为什么要搞“组”这个概念?
很简单,批量授权。想象一下:你的服务器上跑了 5 个 Web 项目,有 4 个开发人员和 2 个运维人员需要分别访问不同的项目目录。如果不用组,每次增加一个人都要手动调整目录权限,费时费力还容易漏。
组的精髓在于“中间层”,它把用户和权限解耦了。在实际环境里,我是强烈不建议把普通用户直接加入 root 组的。这是一个常见的错误做法,因为 Linux 下很多程序(特别是 GUI 环境的)判断管理员身份就是查 UID 是否为 0,或者查用户是否在 wheel/root 组里。把用户加入 root 组,等于变相给了 UID 0 的权限,失去权限管理的意义。真需要提权,后面的 sudo 机制才是正确方案。
2.3 最小权限原则:放权要谨慎
做账号规划时有一个绕不开的原则,叫最小权限原则——给用户分配恰好能完成工作的权限,不做多余授予。这个原则应该贯穿于账号、组、文件权限、sudo 等所有环节。
以实际场景为例:假如你要部署一个 Nginx + PHP 站点,理论上 Nginx 只需要对站点根目录有读权限、对日志目录有写权限。正确的做法是把站点目录的所有者设为某个普通账号(比如 www-data),Nginx 进程以该账号运行。你要是图省事直接让 Nginx 以 root 运行,一旦 Web 应用有漏洞(比如文件上传漏洞被利用),攻击者就直接拿到 root 权限了——这种情况在真实的攻防演练中实在太多见了。
3. 用户和组的实操:从创建到删除的完整闭环
理论说完了,下面进入实际命令操作。这一部分我建议你打开终端,跟我一起动手跑一遍。
3.1 创建用户:useradd 的三个关键参数
Linux 创建用户的命令是 useradd,但我推荐你用它背后的配置工具 adduser(不同发行版有一定差别,Debian/Ubuntu 下有交互式向导,CentOS 下两者差不多)。
直接看实操:
bash复制# 创建一个用户,指定家目录、初始组、附加组和登录 shell
useradd -m -d /home/zhangsan -u 1001 -g dev -G docker,extra -s /bin/bash zhangsan
参数拆解如下:
-m:自动创建家目录。如果不加这个参数,很多发行版默认不建家目录,用户登录后连cd ~都进不去。-d:指定家目录路径,默认是/home/用户名。-u:手动指定 UID。批量管理多台机器时很有用,可以保证同一用户在不同机器上 UID 一致,避免 NFS 文件权限错乱。-g:指定初始组。初始组是用户的主要组,用户创建的文件默认属于这个组。-G:指定附加组列表,多个组用逗号分隔。附加组用于授予额外的资源访问权限。-s:指定登录 shell。如果设为/sbin/nologin,该用户就不能登录系统,只能通过 FTP 等服务访问文件;这对创建服务账号非常实用。
3.2 设置密码和账号有效期
创建完用户后,第一件事是设置密码:
bash复制passwd zhangsan
这里有个小技巧:批量初始化密码时,可以用管道从标准输入读入:
bash复制echo '123456' | passwd --stdin zhangsan
提示:--stdin 这个参数是 Red Hat 系列支持的特性,Debian/Ubuntu 系列的 passwd 不支持该参数。跨发行版批量设置密码时,建议改用 chpasswd:
bash复制echo 'zhangsan:123456' | chpasswd
设置完初始密码,还要考虑密码策略。新建的密码如果太简单,系统可能会拒绝;对于生产服务器,我建议至少满足 12 位以上、包含大小写字母、数字和特殊字符。另外,你可能还需要设置账号有效期,比如临时员工的账号用完即失效:
bash复制# 查看账号密码过期信息
chage -l zhangsan
# 设置 30 天后过期,之后还能用 7 天(宽限期)
chage -M 30 -I 7 zhangsan
3.3 修改用户属性与删除用户
用户创建后想调整属性怎么办?用 usermod,它的参数和 useradd 几乎一样:
bash复制# 将 zhangsan 的附加组改为 docker,同时保留原有的 dev 组
usermod -G docker,dev zhangsan
# 锁定用户(禁止登录),和解锁
usermod -L zhangsan
usermod -U zhangsan
注意:-G 参数后面写的是最终想要的附加组列表,不是增量追加。如果之前附加组有 extra,上面的命令会把它移除。想追加,必须先查当前附加组再拼上新组名。
删除用户相对简单,但有个隐藏坑:
bash复制# 删除用户,连家目录和邮件池一起删
userdel -r zhangsan
不加 -r 的话,用户删了,但家目录里那一堆文件还会留在系统里,时间久了就成了没人认领的孤儿文件。这些文件的属主会显示为一串数字 UID,清理起来很麻烦。
3.4 用户组的管理命令
组的管理命令跟用户的套路几乎一致:
bash复制# 创建组
groupadd dev
# 添加用户到组
gpasswd -a zhangsan dev
# 从组中移除用户
gpasswd -d zhangsan dev
# 删除组(前提是这个组不是任何用户的初始组)
groupdel dev
我个人在实际操作中,更习惯用 gpasswd 而不是直接编辑 /etc/group 文件,因为 gpasswd 会同步处理文件锁,操作更安全。当然,如果你需要批量把用户分组,直接写 /etc/group 文件再跑一遍校验也是可以的,效率更高一点。
4. 文件权限底层逻辑:rwx 和四种身份
账号和组只是“身份的划分”,真正落实到文件层面,靠的是权限系统。这一节是全篇的核心,值得你仔细看。
4.1 一张表看懂权限的三元组
Linux 下每个文件都有一组权限标记,用 ls -l 查看时,第一列长这样:
code复制-rw-r--r-- 1 root root 1024 Nov 12 10:00 test.txt
去掉开头的 -(文件类型标识,d 是目录、l 是软链接),剩下 9 个字符分成三段:
| 位置 | 含义 | 常见字符 |
|---|---|---|
| 第 1~3 位 | 属主(u)权限 | rwx / r-x / r-- |
| 第 4~6 位 | 属组(g)权限 | rwx / r-x / r-- |
| 第 7~9 位 | 其他人(o)权限 | rwx / r-x / r-- |
每个位置的权限又有三种:r(读)、w(写)、x(执行)。对于普通文件,含义很直观;但对于目录,需要特别注意:目录的 r 表示能列出目录内容,w 表示能在目录里创建/删除文件,x 表示能进入目录。所以,如果对一个目录只给 r 不给 x,你会看到目录内容列表,但 cd 进不去,访问内部文件也会被拒绝。
4.2 为什么“权限值”都是 4、2、1?
新手经常问的一个问题:为什么 chmod 755 里的 7 是 rwx,5 是 r-x?
因为权限在 Linux 底层就是用二进制位数表示的,r 对应 4(二进制 100),w 对应 2(010),x 对应 1(001),三数相加就得到了 0~7 的数值。用数值表示,本质上是三个位标志位。7 就是 4+2+1,意味着全部放开;5 是 4+1,意味着只读加执行。理解了位运算,你就永远不会忘记 chmod 的数字含义。
看一些常见组合的实际意义:
644:文件属主可读写,组内和其他人只读。这是普通文本文件的默认权限。755:属主可读写执行,组内和他人可读执行。这是二进制程序和脚本的标准权限,也是目录的默认权限(目录必须要有执行位才能进入)。600:属主可读写,其他人什么都不能做。适合密钥文件、密码文件等敏感数据。700:属主完全控制,其他人无任何权限。适合私密目录。
4.3 修改权限和属主:chmod 与 chown 的最佳实践
chmod 有两种用法,一种是数字法(推荐,简单直接),一种是符号法:
bash复制# 数字法
chmod 750 /opt/project
# 符号法:给属主加执行权限,移除其他用户的写权限
chmod u+x /opt/project/run.sh
chmod o-w /opt/project/run.sh
符号法适合只改某一个权限位的场景,但如果你要一次性设定完整权限,数字法更可靠,不会留下考虑不周的口子。
修改属主用 chown:
bash复制# 修改文件属主
chown zhangsan /data/app.log
# 同时修改属主和属组
chown zhangsan:dev /data/app.log
# 递归修改目录下所有文件(慎用)
chown -R zhangsan:dev /data/project/
实操提醒:递归 chown -R 是一个“危险”操作。如果不小心对系统目录(比如 /usr)执行了错误的属主变更,系统会出现各种诡异问题。我的习惯是:先 ls -l 提前确认目录结构,再用 chown -R --from=原属主:原属组 新属主:新属组 这种带条件的写法,只替换期望匹配的文件。
4.4 目录的默认权限:umask 到底做了什么?
你有没有想过一个问题:为什么新建的文件默认权限是 644,而不是 666 或 777?
这背后的“幕后黑手”就是 umask。它决定了“默认权限中要屏蔽掉什么”。最终权限的计算公式:
code复制文件最终权限 = 666 - umask 值(按位进行)
目录最终权限 = 777 - umask 值
注意:这里说的减法实际上是按位做掩码运算,对于新手先按减法理解即可。文件的 666 减少了执行权限,所以文件默认永远不会带 x 位,这是为了防止意外创建出可执行文件。
执行 umask 查看当前值:
bash复制# 通常输出
0022
umask 为 022 时,文件权限 = 666 - 022 = 644,目录权限 = 777 - 022 = 755。
如果你的环境有特殊需求,比如要把新文件默认权限改成 640,可以修改 /etc/profile 或 ~/.bashrc:
bash复制umask 027
4.5 特殊权限位:setuid、setgid、粘滞位
除了 rwx 之外,Linux 还有三种特殊权限,它们不常被提及,但在实际系统中非常关键。
setuid(s 出现在属主执行位)
一个程序如果设置了 setuid,那么当普通用户执行它时,进程的“有效用户 ID”会变成文件属主的 UID。也就是说,普通用户能以属主身份执行该程序。
最典型的例子就是 /usr/bin/passwd:
bash复制ls -l /usr/bin/passwd
-rwsr-xr-x 1 root root 59640 11月 24 2023 /usr/bin/passwd
普通用户执行 passwd 需要修改 /etc/shadow 文件,而 shadow 只有 root 能写。setuid 让 passwd 程序在运行期间以 root 身份工作,从而完成密码修改。
但 setuid 的风险也极大——如果系统里有一个可被利用的 setuid 程序,攻击者可以借它提权到 root。所以日常运维中,要定期扫描 setuid 文件:
bash复制find / -perm -4000 -type f 2>/dev/null
setgid(s 出现在属组执行位)
对于目录,setgid 有特殊含义:目录设置了 setgid 后,任何人在该目录下新建文件,其属组都会自动继承目录的属组,而不是创建者的私有组。这在多人协作的项目目录中非常有用。
bash复制chmod g+s /data/team_project
设置后,ls -ld 显示为 drwxrwsr-x。
粘滞位 STICKY BIT(t 出现在其他人执行位)
粘滞位最经典的应用是 /tmp 目录。它的作用是:任何用户都能在 /tmp 目录里创建文件,但只有文件的属主(或 root)才能删除自己的文件。
bash复制ls -ld /tmp
drwxrwxrwt 10 root root 4096 11月 12 10:00 /tmp
没有粘滞位,任何人都可以删除别人放在 /tmp 里的文件——这对共享目录来说无疑是灾难。设置粘滞位:
bash复制chmod +t /data/shared_tmp
特殊权限位的数字表示法:setuid=4,setgid=2,粘滞位=1。比如:
bash复制# 设置 setuid 和普通权限 755
chmod 4755 /opt/tool
# 设置 setgid 和普通权限 2770
chmod 2770 /data/team_project
# 设置粘滞位和普通权限 1777
chmod 1777 /data/shared_tmp
5. ACL 与进阶防护:当传统权限不够用时
传统的 ugo 权限最多支持“属主、属组、其他人”三组设定,在多用户多组场景下完全不灵活。比如:一个文件属主是 root,属组是 dev,我想单独给运营部门的一个员工 lisi 读权限,但不想在 dev 组里加人——ugo 做不到,ACL 可以。
5.1 ACL 是什么?怎么用?
ACL(Access Control List,访问控制列表)允许你为任意指定用户或组单独设置权限,不受属主/属组限制。
查看文件 ACL 权限:
bash复制getfacl /data/project
给用户添加权限:
bash复制setfacl -m u:lisi:rx /data/project
给组添加权限:
bash复制setfacl -m g:dev:rwx /data/project
删除指定 ACL:
bash复制setfacl -x u:lisi /data/project
注意,当文件设置 ACL 后,ls -l 的权限列末尾会出现一个 +,比如:
code复制-rw-r-----+ 1 root root 1024 Nov 12 10:00 file.txt
ACL 在大部分现代 Linux 发行版上默认支持(文件系统挂载时启用),但某些精简系统可能需要单独安装 acl 工具。若发现 setfacl 不可用,检查一下:
bash复制# 确认文件系统挂载参数里有没有 acl
mount | grep acl
5.2 不可变属性:chattr 的锁文件技巧
权限系统之外,还有一层保护叫“文件属性”,用的命令是 chattr。它跟权限没关系,是从文件系统层面锁定文件。
最常用的两种属性:
i(immutable,不可变):文件不能被修改、删除、改名,连 root 也不能动。要修改必须先去掉该属性。a(append only,仅追加):只允许追加内容,不能删除或覆盖。非常适合日志文件。
bash复制# 锁定重要配置文件
chattr +i /etc/passwd
# 给日志文件设置仅追加
chattr +a /var/log/secure.log
# 查看文件属性
lsattr /etc/passwd
# 解除锁定
chattr -i /etc/passwd
这个招数在处理“服务器被改 hosts 文件”“日志被异常清空”等场景时特别有用。不过要注意,chattr +i 会让软件正常更新时无法覆盖文件,升级前记得去掉属性。
5.3 sudo 提权:合理授权的最后一道闸门
无论是之前的权限还是 ACL,都是针对文件系统层面。但系统管理操作需要 root 权限怎么办?直接给 root 密码是最坏的选择,正确方案是用 sudo。
sudo 的核心机制是:普通用户通过身份验证后,被允许以 root(或其他指定用户)身份执行特定命令,所有操作都会在系统日志中留下记录。
配置 sudo 权限的文件是 /etc/sudoers,推荐用 visudo 编辑:
bash复制visudo
最常用的 sudoers 规则形式:
code复制# 允许 zhangsan 执行任何命令
zhangsan ALL=(ALL) ALL
# 允许 dev 组执行任何命令(需要输入自己的密码)
%dev ALL=(ALL) ALL
# 允许 zhangsan 无需密码执行 systemctl 命令
zhangsan ALL=(ALL) NOPASSWD:/usr/bin/systemctl
# 只允许执行特定命令,禁止其他
zhangsan ALL=(ALL) /usr/bin/systemctl
关于 sudo 配置,有几点值得强调:
- 尽量用 NOPASSWD 配合特定命令限制。生产环境中,要求管理员每次输入密码,可以防止密码泄露后别人随意操作。
- sudo 配置里命令路径必须是完整路径。因为 sudo 不依赖 PATH,
/usr/bin/systemctl和/bin/systemctl可能是同一个文件的两个链接,配错了容易“命令找不到”。 - 给用户配 sudo 前,先确认他是否真的需要 root 权限。很多常规运维操作(查看日志、重启服务)并不需要完整 root 权限,通过
systemctl或journalctl的 NOPASSWD 配置就可以覆盖。
一个实际应用场景:线上服务器需要让开发同事看 Nginx 日志和重启 Nginx,但不希望他们乱改系统。配置如下:
code复制# 开发用户能看日志、重载 Nginx,无需密码
dev ALL=(ALL) NOPASSWD:/usr/bin/tail, /usr/bin/less
dev ALL=(ALL) NOPASSWD:/usr/bin/systemctl reload nginx
这样既满足了需求,又把权限控制到了能覆盖的最小范围。
6. 常见问题排查与实战避坑
这一章节内容是很多刚从“会命令”向“会运维”过渡的人最关心的——纸上谈兵容易,遇到真问题手忙脚乱。我整理了这几个高频问题,全部来自真实事故复盘。
6.1 忘记 root 密码怎么办?
有两种典型场景:一是服务器在机房/云端,可以物理重启;二是容器或者无物理控制台的环境。
物理机/虚拟机场景:重启系统,在 GRUB 启动菜单时按 e 进入编辑模式,找到 linux 开头的行,在末尾加上 rd.break enforcing=0(CentOS/RHEL 系)或 init=/bin/bash(Debian 系),然后按 Ctrl+x 启动,进入紧急模式后重新挂载根文件系统为可写,再用 passwd root 重置密码。
云端场景(无法重启的)比较麻烦,一般用云厂商的“重置密码”功能,或者挂载系统盘的方式修改。这种操作建议在业务低峰期进行,并提前备份关键数据。
6.2 为什么用户能 SSH 登录,却不能 su 到 root?
很多人遇到这个问题:用户输入正确的密码,su - root 却提示 Authentication failure。
大多数发行版默认启用 PAM 的 wheel 组限制,只有 wheel 组的成员才允许 su 到 root。解决办法是:
bash复制usermod -aG wheel zhangsan
或者修改 /etc/pam.d/su 里 pam_wheel.so 参数。如果你不需要这个限制,把它注释掉也可以,但安全性会降低。
6.3 权限明明是对的,为什么还是 Permission denied?
我见过不少这样的情况:ls -l 看到的权限是 755,属主也正确,但程序就是报无权限。这时候往往要排查几个隐蔽点:
- 父目录权限:文件在
/data/project/a/b,如果/data/project对用户没有 x 权限,用户根本走不到/data/project/a/b。这种错误很隐蔽,因为ls可能还能看到文件(取决于目录权限),但打开时会被拒绝。排查命令:namei -l /data/project/a/b,它会展示路径上每一级的权限。 - ACL 覆盖:文件设置了 ACL,
ls -l不会显示完整 ACL 内容,必须getfacl查看。 - SELinux:Red Hat 系发行版的 SELinux 可能拦截权限。临时关闭测试定位问题:
bash复制
如果能访问了,说明是 SELinux 策略问题,再用setenforce 0audit2why -a分析具体规则。
6.4 sudo 突然用不了:sudoers 被改坏了
这是运维事故频发区。sudoers 文件如果语法错误,所有 sudo 操作都会直接失败,连 root 都用不了 sudo。此时用户会报“sudo: parse error in /etc/sudoers near line X”。
如果还能用物理终端以 root 登录,直接运行 visudo 修复。如果连 root 都进不去,那就重启进入单用户模式修复。所以我的建议是:在改 sudoers 之前,先另开一个 root shell 或者执行 sudo visudo -c 做语法检查。配置完成后再执行一次 sudo -l 验证当前用户可以执行的命令列表。
6.5 一个实战案例:新建的用户无法登录图形桌面
在 Linux 桌面版上新建的用户登录后,显示黑屏或直接回到登录界面。最常见的原因是用户目录权限不对。用户组策略要求家目录 /home/zhangsan 的属主必须是 zhangsan,权限不能超过 755(不能是 777)。
bash复制chown -R zhangsan:zhangsan /home/zhangsan
chmod 755 /home/zhangsan
如果还不行,优先查看系统日志:
bash复制journalctl -xe -g 'zhangsan|gdm|sddm'
7. 设计一套可落地的账号权限规范
最后再说点更宏观的。学了这么多命令和原理,最怕的是学完了还是不知道在自己的机器上该怎么规划。我在这里分享一套我自己的账号规划和权限基线,不要求完全照搬,但可以作为参考。
第一步:把系统账号和用户账号分开
- 系统账号(UID < 1000):服务进程使用,不分配真实登录权限(
shell设为/sbin/nologin)。 - 用户账号(UID ≥ 1000):真实人员使用,按角色划分组。
第二步:规划组结构
比如你的团队有开发、运维、测试三个角色:
bash复制groupadd dev
groupadd ops
groupadd test
groupadd www-data # Web 服务专用组
每个新加入项目的成员,根据其角色加入对应的组,目录授权以组为单位进行,这样成员变更时只需调整组成员关系,不碰文件权限。
第三步:文件权限基线
- 项目代码目录:属主是项目负责人,属组是 dev,权限 750。这样同一组的开发者可以读写执行,其他角色只能读不能写。
- 配置文件:属主 root,属组 ops,权限 640。
- 密钥文件(如 id_rsa、证书私钥):属主本人,权限 600。
- 日志目录:属主服务账号,权限 755(文件 644)。
第四步:sudo 权限定人定责
只给运维和开发 Leader 分配 sudo 权限,其他成员有事走流程,由有权限的人执行。sudoers 里按用户分块配置,禁止一行通配 ALL ALL=(ALL) ALL。这样既能保证操作可追溯,又能避免权限失控。
第五步:定期巡检
我建议至少每季度做一次账号巡检,检查以下事项:
bash复制# 检查哪些用户有登录 shell
cat /etc/passwd | grep -v '/sbin/nologin' | grep -v '/bin/false'
# 检查所有 UID 为 0 的用户(除了 root 不应该有其他人)
awk -F: '$3==0{print $1}' /etc/passwd
# 检查空密码账号
awk -F: '($2==""){print $1}' /etc/shadow
# 检查 sudoers 中 NOPASSWD 的条目
grep NOPASSWD /etc/sudoers /etc/sudoers.d/*
做完这些检查,配合日志审计,基本就能把“账号和权限管理”这件事做成制度化动作,而不是靠脑子记。
8. 写在最后的一点经验之谈
整套账号和权限管理体系学下来,你可能觉得知识点很多很杂。但我个人在实际操作中最大的体会是:权限管理的真正难点不在于命令记了多少,而在于是否形成了“最小权限 + 可追溯”的思维习惯。
命令忘记了大不了查一下 man 手册,可要是脑子里没有“哪些权限该开、哪些不该开”这个概念,配置出的系统就像漏了底的篮子,再多的命令也救不回来。我建议你从小事做起:下一次在自己机器上部署服务时,别再顺手 root 一把梭;下一次给同事开账号时,想想他到底需要什么权限,能不能用组来管,能不能用 sudo 来限。
最后再分享一个小技巧:给关键文件设置了 chattr +i 之后,务必在文档里记清楚,否则过了一段时间你自己都会忘,排查问题时还会怀疑是文件系统坏了。做账号和权限管理,和写代码一样——可读性、可维护性、可审计性,远比炫技重要得多。
