chmod 权限详解:755、644 与粘滞位
在类 Unix 系统中,chmod 用于修改文件和目录的访问权限。读、写和执行权限分别针对所有者、所属组和其他用户进行设置。目录权限有其特殊含义:它们影响列出名称、创建或删除条目,以及访问已知路径。
数字模式与符号模式
像 chmod u+x script.sh 这样的符号命令会赋予所有者执行该文件的权限。在数字模式中,读为 4,写为 2,执行为 1。因此 755 表示 rwxr-xr-x:所有者可以读、写和执行,而所属组和其他用户可以读和执行。模式 644 通常适用于普通的公开文件,但是否合适取决于具体应用。不要把某个熟悉的数字当作通用的安全设置。
为什么目录权限很重要
对于目录,读权限允许列出名称,写权限允许修改目录条目,执行权限允许遍历已知路径。删除文件通常取决于其父目录的权限,而不是文件本身的写权限。因此,即使文件被设为 444,对该目录拥有足够权限的人仍然可以删除它。GNU Coreutils 手册解释了这一区别。如果目标文件看起来可读但访问仍然失败,请检查每一级父目录以及服务运行时所用的身份。
Web 主机示例
设想有一个存放 HTML 文件的目录,Web 服务器必须能够读取,但只有所有者可以更新。一个起点是目录设为 755,普通文件设为 644。您仍需考虑服务账户、用户组和主机服务商的规则;私密的配置文件可能需要更严格的访问权限。为了消除报错而把所有内容都设为 777,会让本地用户获得广泛的修改权限,并可能引入安全问题。修改之前,请先用 stat 和 ls -l 查看当前的所有者和权限。
setuid、setgid 与粘滞位
开头的第四位八进制数字用于指定特殊权限位:4 表示 setuid,2 表示 setgid,1 表示粘滞位(sticky)。例如,4755 会为可执行文件启用 setuid;455 则不会。使用 setuid 必须谨慎,因为程序中的缺陷可能以所有者的权限被执行。对于目录,setgid 可以让新建条目继承目录的所属组。在 /tmp 这类共享目录上设置粘滞位,可以限制谁能删除或重命名其他用户的文件。执行 chmod -R 之前,请仔细检查目标目录树:普通文件、可执行文件和目录很少需要完全相同的权限模式。