在 Linux 里递归修改权限,最常用的命令是 chmod 加 -R 参数。-R 表示递归,会把指定目录以及目录下的所有文件和子目录都纳入权限修改范围。实际使用中,数字模式写起来最直接,比如 chmod -R 755 /path/to/folder 会把目录和里面所有文件统一设成所有者可读写执行、组和其他人可读可执行。符号模式更灵活,比如 chmod -R u+rwX,go+rX /path/to/folder,其中大 X 是一个很实用的权限位,它只对目录以及本来就有执行位的文件生效,普通文本文件不会被误加上执行权限。我自己的习惯是,给网站目录或者共享目录改权限时优先用带大 X 的符号模式,比直接 755 更稳妥,不容易把一堆普通文件变成可执行文件。

数字模式有一个需要留意的地方,它对目录和文件一视同仁。目录通常需要执行位才能进入和遍历,普通文件一般不需要执行位。如果直接 chmod -R 644,目录会失去执行位,导致无法进入;如果直接 chmod -R 755,普通文件也会带上执行位。比较稳妥的做法是把目录和文件分开处理。可以先用 find /path/to/folder -type d -exec chmod 755 {} + 把目录设为 755,再用 find /path/to/folder -type f -exec chmod 644 {} + 把普通文件设为 644。这样目录能正常进入,文件也不会多出执行权限。这个写法比一条 chmod -R 更啰嗦,但在权限要求比较严格的环境里更可靠。
递归修改之前,先确认目标路径和当前权限。可以用 ls -ld /path/to/folder 看目录本身的权限,用 ls -la /path/to/folder 看里面文件的大致情况。目录名带空格或者特殊字符时,路径要用引号包起来,避免命令被拆错。使用相对路径时尤其要小心,不要在不确定当前目录的情况下执行 chmod -R 777 . 这类命令。更稳妥的做法是写绝对路径,改完再用 ls -l 抽查几个文件和目录,确认权限符合预期。我自己吃过一次亏,在项目根目录下顺手递归改权限,结果把不该放开的脚本也改成了所有人可写,后来养成了改完必抽查的习惯。
权限数值不宜图省事直接给 777。777 意味着所有者、组和其他人都有读、写、执行权限,放到共享目录或者线上环境里风险很高。常见做法是目录 755、文件 644,需要组内协作时用 775 和 664,配合用户组来管理写权限。如果确实需要更细的权限,比如让某个用户对目录有写权限但不影响其他人,可以考虑 ACL,用 setfacl -R -m u:username:rwx /path/to/folder 递归设置,再用 getfacl 查看结果。ACL 适合多用户协作场景,比单纯改基本权限位更灵活,但也要注意备份和可移植性。
符号链接需要单独留意。chmod -R 在递归时通常会忽略指向目录的符号链接,不会顺着链接去改目标目录的权限,这一点在大多数情况下是保护性的。但如果你的目录里混有符号链接,改完权限后最好用 find 配合 -type l 检查一下链接本身,确认没有出现预期之外的权限变化。挂载点也要小心,递归操作跨越挂载点可能会影响到其他文件系统,必要时用 find 的 -xdev 参数限制在同一文件系统内。
还有一个很基础但容易被忽略的点是 umask。新建文件和目录的默认权限受 umask 影响,递归修改只能解决已有文件,后续新建的东西仍然按 umask 走。如果希望目录里新生成的文件也保持合理权限,除了改现有权限,还要确认运行服务的用户 umask 设置是否合适。
整体来说,Linux 递归修改权限的核心就是 chmod -R,数字模式直观,符号模式灵活,大 X 能避免普通文件被误加执行位。目录和文件权限要求不同时,用 find 分类型处理更稳。改之前确认路径,改之后抽查结果,不轻易使用 777,涉及多用户协作再考虑 ACL。把这几个习惯养好,递归改权限这件事就不容易出问题。

评论列表 (0条):
加载更多评论 Loading...