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 = 1
和 x
共享位置:
- 原先就没有
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