权限管理 ================= 文件描述符 --------------- ``ls -l`` 命令输出的第 1 个字段就是描述文件和目录权限的编码。 :: drwxrwxr-x 13 fong fong 4096 5月 7 10:33 source/ 第一个字符代表对象的类型: - -:普通文件 - d:目录 - l:链接 - c:字符型设备文件 - b:块设备文件 - n:网络设备文件 之后是 3 组三字符的编码,每一组定义了 3 种访问权限(若没有某种权限,使用 \- 代替): - r:可读 - w:可写 - x:可执行 ``ls -F`` 会在可执行文件的文件名后加一个 ``*`` ,目录后方加 ``/`` 。 3 组权限对应对象的 3 个安全等级: - 对象的属主(登录名 fong) - 对象的属组(组名 fong) - 系统其它用户 第 2 个字段是文件链接数,第 3 个字段是属主,第 4 个字段是属组,第 5 个字段是占用存储大小,第 6 个字段是最后修改时间。 .. note:: 除了 ``r`` ``w`` ``x`` ,还会见到 ``s`` ``t`` ,分别表示 SetUid/SetGid、粘滞位。 粘滞位 ---------------- .. code-block:: bash :linenos: $ ll / | grep tmp drwxrwxrwt 1 root root 4.0K 2022-11-20 22:16:34 tmp/ $ ll /var | grep tmp drwxrwxrwt 2 root root 4.0K 2022-08-27 01:43:44 tmp/ 上面两个存放临时文件的系统目录的权限最后一位是 ``t`` ,这是粘滞位。当目录被设置了粘滞位以后,即使用户对该目录有写权限,也不能删除该目录中其他用户的文件,只有文件的拥有者和 root 用户才可以删除。这就达到了各个用户可以在同一目录中读、写、修改、删除文件,但是不能随意删除其他用户文件的目的。 设置粘滞位: .. code:: bash chmod +t .. note:: 如果权限最后一位是 ``T`` ,说明该目录没有可执行权限,应执行: ``chmod +x `` 。 默认文件权限 ---------------- ``umask`` 查看默认文件权限, ``unask -S`` 打印符号化的权限: .. code-block:: bash :linenos: $ umask 0002 $ umask -S u=rwx,g=rwx,o=rx ## 临时修改默认权限 (若要长期生效,把 umask 0022 写进 ~/.bashrc) $ umask 0022 $ umask 0022 $ umask -S u=rwx,g=rx,o=rx 第 1 位用于 SetUid(对应 4 )或 SetGid(对应 2 )或粘着位(Sticky Bit,对应 1),后 3 位表示文件或目录对应的 umask 八进制值,分别对应 3 组权限。 .. table:: Linux文件权限码 :align: center =========================== =========================== =========================== 权限 二进制值 八进制值 =========================== =========================== =========================== \- \- \- 000 0 \- \- x 001 1 \- w \- 010 2 \- w x 011 3 r \- \- 100 4 r \- x 101 5 r w \- 110 6 r w x 111 7 =========================== =========================== =========================== umask 值只是 **掩码** ,屏蔽不想授予的权限,即:真正的权限是用 **全权限** 值减去 umask 值(逻辑与运算)。 文件的默认全权限值是 **666** ,目录的全权限值是 **777** 。当 umask=0022,新建文件默认权限是 644,新建目录默认权限是 755。 .. code-block:: bash :linenos: $ which passwd /usr/bin/passwd $ ll /usr/bin/passwd -rwsr-xr-x 1 root root 63K 2022-03-14 16:26:09 /usr/bin/passwd* ``passwd`` 这个指令的属主权限里面有个 ``s`` ,说明这个文件设置了 SetUid,作用是:拥有该文件的执行权限的任意用户,在执行该文件的时候,都是以该文件的属主(root)的权限来执行的。因为用户密码需要写入 /etc/shadow ,而普通用户是没有权限直接写这个文件的。 .. attention:: 基于安全考虑,很多操作系统会忽视对 Shell 脚本进行 SetUid 的操作,执行脚本的时候不会赋予期望的权限。 .. note:: 修改文件或目录的属主、属组使用命令 ``chown`` ,需要 root 权限。 改变权限 ----------------- :: chmod [-cfvR] [--help] [--version] [mode] [file...] 参数: -c 若该文件权限确实已经更改,才打印更改动作 -f 若该文件权限无法被更改,也不打印错误讯息 -v 打印权限变更的详细动作 -R 对目前目录下的所有文件与子目录进行相同的权限变更(即以递回的方式逐个变更) mode: :: [ugoa] [+-=] [rwxXst] - u 表示对象的属主,g 表示对象的属组成员,o 表示系统其它用户,a 表示所有用户。 - \+ 表示增加权限、- 表示取消权限、= 表示唯一设定权限。 - r 表示可读,w 表示可写,x 表示可执行。 .. code-block:: bash :linenos: $ mkdir test $ ls -l drwxr-xr-x 2 fong fong 4096 5月 7 13:34 test/ $ chmod -v 777 test mode of 'test' changed from 0755 (rwxr-xr-x) to 0777 (rwxrwxrwx) $ chmod -v a-w test mode of 'test' changed from 0777 (rwxrwxrwx) to 0555 (r-xr-xr-x) 参考资料 --------------- 1. chmod(1) — Linux manual page https://man7.org/linux/man-pages/man1/chmod.1.html 2. chown(2) — Linux manual page https://man7.org/linux/man-pages/man2/chown.2.html 3. How Do I Set Up Setuid, Setgid, and Sticky Bits on Linux? https://www.liquidweb.com/kb/how-do-i-set-up-setuid-setgid-and-sticky-bits-on-linux/ 4. umask leading 0 https://askubuntu.com/questions/741321/umask-leading-0 5. Shell 命令运行原理和权限详解 https://mp.weixin.qq.com/s/Uz50VbCmzpIqcB7aPwu3gw