文件的权限属性

linux 中,每个文件都有唯一的“所属者”(user)和“所属群组”(group)。owner 和 group 都对文件有特殊的权限

输入ls -l,就可以详细查看每个文件的权限属性。

image

我们可以看到,用户名和群组名可以是相同的。一个群组可以只包含一个用户,也可以包含多个用户。

rwx 权限

ls -l的第一行一定是一个长度为10的字符串:drwxr-xr-x

  • 其中第1位表明文件的类型,常见如-表示一般文件,d表示目录,l表示链接;

  • 第 2-4 位表示所属者的权限,形如rwx,r 代表可读,w 代表可写,x 代表可执行。
    可读代表可以打开文件查看内容,可写代表可以修改文件内容,可执行则代表这个文件可不可以装载到内存中执行。在 linux 中,文件能否装载执行不取决于后缀名,而取决于有无 x 权限,即使让给一个文本文件加上 x 权限后,你也能用命令执行它(虽然执行结果肯定是失败)。

  • 第 5-7 为表示所属群组的权限,也就是这个文件所属群组里的人(除了 user)对他的权限。r-x表示可读可执行,但不可写。

  • 第 8-10 为其他人(others)的权限,也就是除了 user 和 group 中用户以外的其他人。

而这些权限都不受 root 限制,root 就是万能的神,可以随意操作任何文件。

更改文件的权限属性

更改文件权限的命令有chgrp, chown 和 chmod。这三个命令往往需要 root 来执行。

chgrp

chgrp 即“change group”,可以修改文件的群组:

chgrp root a.cpp # 修改a.cpp的群组为 root
chgrp -R mygroup myfolder # 修改myfolder和其中所有文件的群组

chown

chown 改变文件的所属者。同时 chown 也可以改变文件的群组,兼任的 chgrp 的功能。

chown root a.cpp # 修改a.cpp的群组为 root
chown myuser:mygroup a.cpp # 修改a.cpp所属者为myuser,群组为mygroup
chown :mygroup a.cpp # 只修改a.cpp群组为mygroup

chmod

chmod 修改文件的权限(即那个长度10的字符串),有两种使用方式。

常用的用法是将每一个rwx的r记为4、w记为2,x记为1,这样rwx就是一个0-7之间的数字,用三个数字就组成了文件的权限。比如 5 代表 r-x,7 代表 rwx,而 0 代表 ---。

chmod 777 a.cpp # a.cpp对 owner group others的权限都是rwx
chmod 755 a.cpp # a.cpp对 owner 的权限是rwx,对 group 和 others 的权限是r-x

除此之外,也可以直接用 rwx 字符串来修改权限,u 代表 user,g 代表 group,o 代表 others,a 则代表全部。加号,减号与等号都可以赋值。

chmod u=rwx,go=rx a.cpp # u修改为rwx g和o修改为r-x
chmod a+x a.cpp # 所有权限全部加上x,r和w权限不变
chmod a-w a.cpp # 所有权限全部去掉w

目录的 rwx 权限

之前提到的 rwx 权限都是针对文件了,那对于目录来说,rwx的意义会有哪些不同呢?在 linux 里,我们不要只目录理解成“文件夹”,而把目录也当成一种特殊的文件,这个文件的内容就是目录下的文件信息,这样就好理解了。

对于目录来说,r 代表你能否读取目录下的文件列表(即是否可以用 ls 列出里面的文件);w 代表是否可以更改目录下的文件列表(也就是在目录下新建,删除,移动和更名),x 则代表能否进入这个目录。

目录的权限非常重要!如果我的主目录下有一个 root 所属的文件夹:

drwxr--r-- 2 root root 4096  1月 16 12:45 root/

“我”对于这个目录是 others,因此只有 r 权限。但我不能cd root,也不能打开 root 下的文件,因为没有 x 权限。所以无权操作目录,只有 r 没有 x的目录就像一个不能运行的二进制文件。r 权限没有起到实质作用。

另一方面,假设如果我的主目录下有一个 root 所属的文件:

drwx------ 2 root root 4096  1月 16 12:45 rootfile

“我”对于这个目录是 others,因此只有没有权限。但我对~目录有完整的rwx权限,所以虽然我不能打开,也不能修改文件,我却可以直接删掉他!文件能否打开修改取决于自己的权限,但能否被移动删除等则取决于目录的权限。

rws 和 rwt 特殊权限

我们查看/tmp/usr/bin/passwd的权限,就会发现原来还有rwsrwt权限

drwxrwxrwt 3 root root 4096  1月 16 15:42 /tmp
-rwsr-xr-x 1 root root 59976  3月 14  2022 /usr/bin/passwd

SUID 权限

位于所有者权限的 x 替换为 s 就叫做SUID权限,这个权限具有以下的性质:执行程序的人需要有 x 权限才能执行(那是废话),但在执行途中将获得 owner 的权限。

这个权限有什么意义呢?就以/usr/bin/passwd作为例子,他是用来修改密码的,而密码信息保存在/etc/shadow里面,而 shadow 储存着用户信息这样机密的内容,他的权限是"-rw-r-----",也就是说我连打开都不行。可用户修改密码也并不需要 root 权限。这就是因为 passwd 命令是 rws,当我执行他时,我就暂时获得了 root 的权限,可以修改密码。

另一个例子就是 sudo 命令,用 ls 查看 sudo ,它的权限是"rwsr-xr-x",任何用户都可以执行他,在执行他的期间就暂时获得了 root 权限。sudo 这个命令本身就是理解 SUID 的最佳方式

SGID 权限

位于所属群组权限的 x 替换为 s 就叫做 SGID 权限,与 SUID 相似,执行程序的人可以获得群组的支持。

SGID 也可以用于目录,当进入一个 SGID 的目录,在该目录下新建的所有文件都会以目录的群组作为群组。

SBIT 权限

SBIT 权限则仅用于目录。others 权限为rwt表示 SBIT 权限,在 SBIT 的权限的文件夹里,所有人都可以创建文件,但创建的文件只有自己才能删除,其他用户无法删除。/tmp就是 SBIT 应用的典型,所有人都可以创建文件,但只能删除自己的文件,而不能删除其他用户创建的。

这三个权限怎么设置呢?记 SUID, SGID, SBIT 分别为 421,又可以得到一个 0-7 的数字,把这个数字加在原来的3位数字前,变成4位就可以了。或者通过字符串设置也可以。

chmod 4755 a.out # rwxr-xr-x
chmod u+s a.out # SBIT

umask 默认属性

当我们新创建一个文件,他的 user 和 group 默认都是你自己,那默认的 rwx 权限是什么呢?这就取决于用户的 umask。

输入umask,可以得到一个4位字符串:

$ umask
0022
$ touch f1
$ mkdir f2
$ ls-d f1 f2
-rw-r--r-- 1 ofnoname ofnoname    0  1月 16 17:14 f1
drwxr-xr-x 2 ofnoname ofnoname 4096  1月 16 17:14 f2

0022 表示的的是“被拿掉的权限”,022自然表示“user 不拿权限,而 group 和 other 默认被去掉 w 权限”。目录文件默认是777,因此结果是 rwxr-xr-x,而普通文件默认是666(没有 x),因此结果是rwxr-xr-x。

*文件目录的隐藏权限

(摘自《鸟哥的linux私房菜 基础篇》)

rwx 权限是所有 linux 都拥有的基础权限。除此之外,rwx在很多时候还不够满足需求,特定的文件系统还支持很多其他有用的属性。

chattr [+-=][ASacdistu] 文件或目录名称
选项与参数:
+ :增加某一个特殊参数,其他原本存在参数则不动。
- :移除某一个特殊参数,其他原本存在参数则不动。
= :设置一定,且仅有后面接的参数
A :当设置了 A 这个属性时,若你有存取此文件(或目录)时,他的存取时间 atime 将不会被修改,
可避免 I/O 较慢的机器过度的存取磁盘。(目前建议使用文件系统挂载参数处理这个项目)
S :一般文件是非同步写入磁盘的(原理请参考[前一章sync](../Text/index.html#sync)的说明),如果加上 S 这个属性时,
当你进行任何文件的修改,该更动会“同步”写入磁盘中。
a :当设置 a 之后,这个文件将只能增加数据,而不能删除也不能修改数据,只有root 才能设置这属性
c :这个属性设置之后,将会自动的将此文件“压缩”,在读取的时候将会自动解压缩,
但是在储存的时候,将会先进行压缩后再储存(看来对于大文件似乎蛮有用的!)
d :当 dump 程序被执行的时候,设置 d 属性将可使该文件(或目录)不会被 dump 备份
i :这个 i 可就很厉害了!他可以让一个文件“不能被删除、改名、设置链接也无法写入或新增数据!”
对于系统安全性有相当大的助益!只有 root 能设置此属性
s :当文件设置了 s 属性时,如果这个文件被删除,他将会被完全的移除出这个硬盘空间,
所以如果误删了,完全无法救回来了喔!
u :与 s 相反的,当使用 u 来设置文件时,如果该文件被删除了,则数据内容其实还存在磁盘中,
可以使用来救援该文件喔!

注意这些属性并非在任何系统上都有支持。lsattr可以列出这些隐藏属性。