Linux 文件权限和 MacOSX 上特殊的权限

2019/07/22 Linux

Linux 文件权限和 MacOSX 上特殊的权限

讲在前头

一般的,互联网相关的工作,如果 jd 上写了熟悉 Linux 开发,那么去面试(初中级)的时候肯定会问到文件权限相关的问题,我一度认为自己足够了解了,仔细看了下相关的资料,还差了一些距离,同时现在更换了开发环境,发现 MacOSX 的权限和 Linux 的文件权限有略微区别,就在此记录下来。

Linux 文件权限的展示

通过 ls -l 输出结果,

drwxr-xr-x light staff  1.2 KB Fri Jul 19 14:58:12 2019   .
drwxr-xr-x light staff  816 B  Mon Jun 24 15:25:52 2019   ..
.rw-r--r-- light staff    8 KB Wed Feb 13 11:34:02 2019   .DS_Store
.rw-r--r-- light staff  3.1 KB Tue Jun 18 14:42:46 2019   2019-01-01-some-skills.md
.rw-r--r-- light staff  9.6 KB Tue Jun 18 14:42:55 2019   2019-01-02-单元测试浅析.md
.rw-r--r-- light staff  2.8 KB Tue Jun 18 14:43:12 2019   2019-01-03-argparse学习.md

可以看到输出结果最左边一列,类似于 -rwxrwxrwx 十个字符就是文件的权限信息。

第 1 个字符一般用来区分文件和目录,第 2~10 个字符是用来表示权限。

第一个字符 说明
d 表示是一个目录,事实上在 ext2fs 中,目录是一个特殊的文件
表示这是一个普通的文件
l 表示这是一个符号链接文件,实际上它指向另一个文件
b、c 分别表示区块设备和其他的外围设备,是特殊类型的文件
s、p 这些文件关系到系统的数据结构和管道,通常很少见到

一般权限

第 2~10 个字符当中的每 3 个为一组,左边 3 个字符表示拥有者权限,中间 3 个字符表示与 所有者同一组的用户的权限,右边 3 个字符是 其他用户的权限。这三个一组共 9 个字符,代表的意义如下:

权限符号 说明 对应数值 对文件而言 对目录而言
r Read,读取 4 对文件而言,具有读取文件内容的权限 对目录来说,具有浏览目录的权限
w Write,写入 2 对文件而言,具有新增、修改文件内容的权限 对目录来说,具有删除、移动目录内文件的权限
x eXecute,执行 1 对文件而言,具有执行文件的权限 对目录了来说该用户具有进入目录的权限
表示不具有该项权限 0 - -

常见例子:

权限 说明
-rwx—— 文件所有者对文件具有读取、写入和执行的权限
-rwxr―r– 文件所有者具有读、写与执行的权限,其他用户则具有读取的权限
-rw-rw-r-x 文件所有者与同组用户对文件具有读写的权限,而其他用户仅具有读取和执行的权限
drwx–x–x 目录所有者具有读写与进入目录的权限,其他用户近能进入该目录,却无法读取任何数据
Drwx—— 除了目录所有者具有完整的权限之外,其他用户对该目录完全没有任何权限

每个用户都拥有自己的专属目录,通常集中放置在 /home 目录下,这些专属目录的默认权限为 drwx——,表示目录所有者本身具有所有权限,其他用户无法进入该目录。执行 mkdir 命令所创建的目录,其默认权限为 rwxr-xr-x,用户可以根据需要修改目录的权限。

此外,默认的权限可用 umask 命令修改,用法非常简单,只需执行 umask 777 命令,便代表屏蔽所有的权限,因而之后建立的文件或目录,其权限都变成 000,依次类推。通常 root 帐号搭配 umask 命令的数值为 022、027 和 077,普通用户则是采用 002,这样所产生的权限依次为 755、750、700、775。有关权限的数字表示法,后面将会详细说明。

附加权限

linux 除了设置正常的读写操作权限外,还有关于一类设置也是涉及到权限,叫做 Linxu 附加权限。包括 SET位权限(suid,sgid)和粘滞位权限(sticky)。

SET位权限

suid/sgid 是为了使“没有取得特权用户要完成一项必须要有特权才可以执行的任务”而产生的。 一般用于给可执行的程序或脚本文件进行设置,其中 SUID 表示对属主用户增加 SET 位权限,SGID 表示对属组内用户增加 SET 位权限。执行文件被设置了 SUID、SGID 权限后,任何用户执行该文件时,将获得该文件属主、属组账号对应的身份。在许多环境中,suid 和 sgid 很管用,但是不恰当地使用这些位可能使系统的安全遭到破坏。所以应该尽量避免使用 SET 位权限程序。(passwd 命令是为数不多的必须使用“suid”的命令之一)。

  • suid(set User ID,set UID) 的意思是进程执行一个文件时通常保持进程拥有者的 UID。然而,如果设置了可执行文件的 suid 位,进程就获得了该文件拥有者的 UID
  • sgid(set Group ID,set GID) 意思也是一样,只是把上面的进程拥有者改成进程组就好了。

如果一个文件被设置了 suid 或 sgid 位,会分别表现在所有者或同组用户的权限的可执行位上;如果文件设置了 suid 还设置了 x (执行)位,则相应的执行位表示为 s (小写)。但是,如果没有设置 x 位,它将表示为 S (大写)。

常见例子:

权限 说明
-rwsr-xr-x 表示suid被设置,且拥有者有可执行权限
-rwSr–r– 表示suid被设置,但拥有者没有可执行权限
-rwxr-sr-x 表示sgid被设置,且群组用户有可执行权限
-rw-r-Sr– 表示sgid被设置,但群组用户没有可执行权限

粘滞位权限

粘滞位权限即 sticky。一般用于为目录设置特殊的附加权限,当目录被设置了粘滞位权限后,即便用户对该目录有写的权限,也不能删除该目录中其他用户的文件数据。设置了粘滞位权限的目录,是用 ls 查看其属性时,其他用户权限处的 x 将变为 t。

一个文件或目录被设置了粘滞位权限,会表现在其他组用户的权限的可执行位上。如果文件设置了 sticky 还设置了 x(执行)位,其他组用户的权限的可执行位为 t(小写)。但是,如果没有设置 x 位,它将表示为 T(大写)。

常见例子:

权限 说明
-rwsr-xr-t 表示设置了粘滞位且其他用户组有可执行权限
-rwSr–r-T 表示设置了粘滞位但其他用户组没有可执行权限

修改权限

一般通过 chmod 指令修改文件权限,主要有两种使用方法,一种是数字表示法,一种是字符表示法。

数字表示法

我们已经知道权限由三组组成,每一组拥有三个权限,如果有就计数,如果没有就为0,计数规则为 r = 4 w=2 x=1,可以放在二进制的概念下理解。

假如有个权限组是 rwx,那么转成二进制就是 111,可以看出是十进制的 7,而 r = 4 w=2 x=1就很好理解了。再举个例子,r-x,二进制是 101,那么十进制就是 5

知道了上面这么多,就可以对 文件 进行权限赋予了,下面举一些例子。

权限指令 修改后的权限模样
chmod 700 -rwx——
chmod 766 -rwxrw-rw-
chomd 040 —-r—–

但这只针对一般权限,如果是特殊权限该怎么办?多加一位,放在最前面。

我们可以假定三个特殊权限也各有一个值,分别是 s(SUID)/S = 4 s(SGID)/S = 2 t/T = 1,那么上面的三个数字表示就要变成四个数字表示了,下面举些例子。

权限指令 修改后的权限模样
chmod 0700 -rwx——
chmod 1766 -rwxrw-rwT
chmod 1701 -rwx—–t
chomd 7777 -rwsrwsrwt
chmod 7421 -rwsr-S–t

由于只有十位数字,所以 s(SUID)/S = 4 s(SGID)/S = 2 t/T = 1x 共享位置:

  • 原先就没有 x 权限,那么就在对应的位置变成 S 或者 T
  • 原先就有 x 权限,那么就在对应的位置变成 s 或者 t

所以这里会有点绕,我的处理方法一般是先根据后三位写出一般权限,然后再增加特殊权限。

字符表示法

字符表示法也比较简单,相比较数字表示法,可能更容易理解,但由于是相对权限更改,所以和数字表示法各有利弊,根据情况使用。下面的表格会解释每个字符的意思。

符号 作用 类别
+ 增加权限 权限操作
- 移除权限 权限操作
= 唯一设定权限 权限操作
a 所有用户 权限范围
u 文件拥有者 权限范围
g 文件拥有者所在的组 权限范围
o 其他用户 权限范围
r 可读权限 具体权限
w 可写权限 具体权限
x 可执行权限 具体权限
s SET位权限 具体权限
t 粘滞位权限 具体权限

一般的语法类似于 chmod [<权限范围><权限操作><具体权限>] [文件或目录…],举些例子(假设默认权限是———-):

命令 执行后权限 特殊说明
chmod a+x —x–x–x /
chomd a+rw -rw-rw-rw- /
chmod ug+rw -rw-rw—- /
chmod o+x ———x /
chmod u+s —S—— 给文件增加SET位权限suid
chmod u+rwxs -rws—— /
chmod g+rws —-rwS— 给文件增加SET位权限sgid
chmod +t ———T 增加粘滞位权限

其实看到后面,字符表示法也会让人懵逼,总而言之,通过绝对值指定权限的数字表示法用起来更不容易出错。

修改文件所有者

简单的使用 chown 即可。

chown [-R] [username][:groupname] filename/dirname

-R 指定遍历文件夹。

MacOSX 上的特殊权限

在 MacOSX 上查看权限,经常能看到结尾会有 + 或者 @ 权限,这些就是特殊权限。

通过 man ls 可以看到:“如果文件或目录具有扩展属性,则用 ls -l打印权限后面跟个‘@’字符。或者文件或目录具有扩展安全性信息,ls -l打印权限后就有个‘+’字符。”

执行 ls -le, 可以看到更详细的信息,可以看到

drwx------+ 26 light  staff       884  7 22 15:21 .
 0: group:everyone deny delete

也就是说,‘+’ 代表着扩展安全信息为禁止删除。

执行 ls -l@ 查看扩展属性,可以看到

-rw-r--r--@  1 light  staff      4934  7 17 15:40 text.md
	com.apple.lastuseddate#PS	      16
	com.apple.metadata:_kMDItemUserTags	      42
	com.apple.quarantine	      27

通过对比,可以很容易验证:

  • KMDItemUserTags 是 MAC 的标签新功能.
  • FinderInfo 是我们之前提到的 ”0: group:everyone deny delete“ 扩展.
  • Quarantine 也是 MacOSX 在 10.5 引入的功能,大致意思是「隔离执行文件,防止特洛伊木马攻击」

清除权限方法: xattr -c *.txt

Linux下恢复 /tmp 的权限命令

/tmp 目录是个比较特殊的目录,它允许所有用户的读和写。

$ chmod a+rwx,o+t /tmp

Search

    Table of Contents