Linux下权限位使用参考
2011-04-02 16:54:36 阿炯

Linux 是一个多用户、多任务的系统,常常有多人同时使用一台机工作,为了保护每个人的隐私权,"文件所有者"的角色就显得相当重要了。当Linux用户登录系统之后,就会携带一个用户身份(User ID,UID)和一个用户组身份(Group ID,GID),相当于自己的令牌。当需要访问文件或程序时,操作系统查一下令牌就能知道是否能读、写、执行了。


Unix/Linux的权限按用户分为三类:拥有者、群组、其它用户,权限分为读、写和执行,当然还有SUID,SGID和Stickybit;目录权限及粘贴位(suid sgid t位 sticky),目录上的读写执行权限和普通文档有所不同:写单独使用不会发挥其作用,和执行权限连用能够在目录内添加和删除文档。除了读写执行权限以外,一些文件系统(ext[2-4])还支持强制位(setuid 和setgid)和粘滞位(sticky)的特别权限,因此还关联到inode。Linux管理用户及登录信息等可以参考这里,对文件属性修改的chattr和lsattr命令使用可参考这里


文件权限的查看与解读


在根目录下输入 ls -l 可看到如下信息:
[root@localhost /]# ls -l


每条记录由7部分组成,以 lrwxrwxrwx. 1 root root 7 Aug 18 21:27 bin -> usr/bin 为例,按照顺序,具体代表的含义是:

lrwxrwxrwx.代表的是文件类型和权限
1 代表文件连接数
root 代表拥有者
root 代表所属用户组
7 代表文件大小(以K为单位)
Aug 18 21:27 代表文件最后修改时间
bin -> usr/bin 文件名

先来拆分下'lrwxrwxrwx'这串字符,其中第一个字符用来描述文件的类型,可选值为:
– 代表普通文件
d 代表目录
l 代表这个是软连接或硬连接
b 代表块设备,如磁盘等保存大块数据的设备
c 代表字符设备,如鼠标、键盘等需要连续串行读写的设备
s 代表套嵌字(socket)文件
p 代表命名管道文件

这个文件l,则代表是一个软连接或硬连接。紧接的9个字符,需要三个三个的看,分别代表着:
拥有者的权限
所属组的权限
其他用户的权限



顺序为rwx,对应的是Read(读)、Write(写)、eXecute(执行)的权限,如果不具有某项权限,则使用-表示。

最后一个'.'可能让人很疑惑,是用来做什么的,查询了下,资料显示这个点表示的是存在"SELinux的安全标签"!,如果关闭了selinux,则不会出现该点。

rwx 权限详解

rwx 作用到文件
[r]代表可读(read):可以读取,查看
[w]代表可写(write):可以修改,但是不代表可以删除该文件,删除一个文件的前提条件是该文件所在目录有写权限
[x]代表可执行(execute):可以被执行
rwx 作用到目录
[r]代表可读(read):可以读取,查看
[w]代表可写(write):可以修改,目录内创建+删除+重命名目录
[x]代表可执行(execute):可以进入该目录

另外注意到最后的这次演示的最后的文件名,存在着一个 -> 代表则软连接或硬连接,接下来就来学习下软连接和硬连接的区别。

软连接(也称作符号链:symbolic link, symlink or soft link),是一类特殊的文件, 其包含有一条以绝对路径或者相对路径的形式指向其它文件或者目录的引用。有点类似于windows的快捷方式。创建方式是:ln -s source dist
硬连接,指通过索引节点来进行连接。在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。硬连接的作用是允许一个文件拥有多个有效路径名,这样用户就可以建立硬连接到重要文件,以防止"误删"的功能。其原因如上所述,因为对应该目录的索引节点有一个以上的连接。只删除一个连接并不影响索引节点本身和其它的连接,只有当最后一个连接被删除后,文件的数据块及目录的连接才会被释放。也就是说,文件真正删除的条件是与之相关的所有硬连接文件均被删除。创建方式是:ln source dist

通过一些梳理,可以知道软连接与硬连接的一些异同:
使用时差别不大,都相当于一个文件具有不同的路径或文件名
输入删除文件连接的目标文件,软连接会失效,硬连接仅是"连接数-1"
软链接可以创建在任何位置,包括网络,而硬连接必须在同一磁盘上

关于软连接和硬连接的详细介绍到整理inode相关知识点的时候再做介绍。

Linux文件权限的修改

接下来学习的是修改文件的属性和权限,首先学习的是修改所属用户或用户组。命令格式:chown [-R] username:group filename (其中-R 在修改文件夹的时候使用,代表的是递归修改。)

修改读写权限共有两种方法:

1、数字法

权限rwx对应的是4,2,1,实际为3位的二进制,如果只要读 权限就是4,如果用户有读写权限,那么就是4+2=6,以此类推。

chmod 700 filename 执行的是设定用户有读写执行的权限,用户组、其他用户都没有权限。



2、文字法

文字法首先要引入四个字母:u、g、o、a,其中u代表user,g代表group,o代表other,a代表all。另外需要学习三个符号:+、-、=,分别代表增加、减去和设定,如:chmod ug+w filename ,意味着给filename 的用户及用户组添加写权限。

补充内容

隐藏文件

刚开始的ls -l其实并没有把目录下的所有文件都显示出来,可以使用ls -al将所有的信息显示出来:
[root@localhost ~]# ls -al

可以看到root的home目录下有很多前面带.的文件,这些文件就是Linux中的隐藏文件,在Linux中将文件在文件名前面加一.即可将文件隐藏。

特殊目录

Linux 下有几个特殊的目录:"."、".."、"-"、"~"
"." 当前目录
".." 上层目录
"-" 上一个工作目录
"~" 当前用户的home目录

特殊文件权限

Linux的文件除了rwx以外,还有s、t这两个特殊的权限。下文其它章节有所提及,看完上面的内容我们来总结和延伸一下:


设备类型
块设备:(block device)
字符设备:(character device)
网络设备:(sock  device)

文件类型在终端下的显示颜色
-  普通文件(normal file):黑色
可执行文件(excute file):绿色 所属用户的可执行权限决定
d  目录(directory):蓝色
c  字符设备文件character:黄色
b  块设备block device:黄色
s  网络设备(sock device):粉红
l  链接文件(link):青绿
p 管道文件(pipe):棕色

chmod 0777 xxxx:将某个文件设置成一个对应的权限
chmod a+x xxxx:将这个文件所有权限加上可执行   a-x 相反
chmod 777 directory -R:将文件夹directory内的所有文件设置成满权限

针对u、g、o,分别有set uid、set gid及sticky。set uid和set gid在u和g的x位置上各采用一个s,sticky使用一个t。目录上配置了setgid,表示在此目录中,任何人建立的文档,都会属于目录所属的组。默认情况下,假如一个目录上有w和x权限,则任何人能够在此目录中建立和删除文档。在可执行文档上,用户能够添加set uid和set gid。指令文档上的强制位,能够让用户执行的指令,以指令文档的拥有者或所属组的身份运行进程。

用户能够用chmod指令来为文档配置强制位和粘滞位。
set uid:chmod u+s 文档名
set gid:chmod g+s 文档名
sticky:chmod o+t 文档名
4(set uid)
2(set gid)
1(sticky)

配置suid/guid
chmod 4755 -rwsr-xr-x suid、文档属主具备读、写和执行的权限,任何其他用户具备读和执行的权限

chmod 6711 -rws--s--x suid、sgid、文档属主具备读、写和执行的权限,任何其他用户具备执行的权限

chmod 4511  -rwS--x-x suid、文档属主具备读、写的权限,任何其他用户具备执行的权限

上面的表中有具备这样权限的文档:rwS --x --x,其中S为大写。他表示相应的执行权限位并未被配置,这是一种没有什么用处的suid配置能够忽略他的存在。

注意:chmod命令不进行必要的完整性检查,能够给某一个没用的文档赋予任何权限,但 chmod 命令并不会对所配置的权限组合做什么检查。因此,不要看到一个文档具备执行权限,就认为他一定是个程式或脚本。关于linux下粘贴位(sticky位),要删除一个文档,您不一定要有这个文档的写权限,但您一定要有这个文档的上级目录的写权限。也就是说,您即使没有一个文档的写权限,但有这个文档的上级目录的写权限,也能够把这个文档给删除,而假如没有一个目录的写权限,也就不能在这个目录下创建文档。怎样才能使一个目录既能够让任何用户写入文档,又不让用户删除这个目录下他人的文档,sticky就是能起到这个作用。

stciky一般只用在目录上,用在文档上起不到什么作用。在一个目录上设了sticky位后,(如/home,权限为1777)任何的用户都能够在这个目录下创建文档,但只能删除自己创建的文档(root除外),这就对任何用户能写的目录下的用户文档启到了保护的作用。

递归的所有权改变chown和chgrp都有一个 -R 选项,该选项可以用来告诉它们递归地将所属权和组改变应用到整个目录树中。例如:chown -R drobbins /home/drobbins

chown 和 chgrp 可以用来改变文件系统对象的所有者和组,而另一个程序chmod — 用来改变我们可以在 ls -l 清单中看到的 rwx 权限。chmod 带有两个或多个参数:“mode”,描述怎样改变权限,后面跟将会受到影响的文件或文件列表:chmod +x scriptfile.sh在上面的示例中,我们的“mode”是 +x。您可能会猜到,+x 模式告诉 chmod,使该特殊文件对于用户、组以及其它任何人都是可执行的。如果想要除去一个文件的所有执行权限,应该这样做:chmod -x scriptfile.sh用户/组/其他粒度到此,我们的 chmod 示例已经影响到了所有三个三元组--用户、组和所有其他用户。通常一次只修改一个或两个三元组很方便。要这样做,只需要在 + 或 - 符号之前,给您想要修改的特定的三元组指定符号字符。对于“用户”三元组使用 u,对于“组”三元组使用 g,对于“其他/每个人”使用 o:chmod go-w scriptfile.sh

上面除去了组和所有其他用户的写权限,而保留“所有者”权限不动。重新设置权限除了交替打开和关闭权限位以外,还可以一起重新设置它们。通过使用 = 操作符告诉 chmod 要指定权限和取消别的权限:chmod =rx scriptfile.sh,在此只设置了所有的“read”和“execute”位,没有设置所有的“write”位。如果仅仅想重新设置特定的三元组,可以像下面这样,在 = 之前指定该三元组的符号名:chmod u=rx scriptfile.sh

Linux下用chmod(change file modebit)改变一个文件的权限一般有两种方式:

1、字母模式
这种方法很直观,u代表拥有者(user),g代表组(group),o代表其它用户(other),a代表所有用户(all)。+-=代表增加、去除、 设置为相应的权限。rwx分别代表读(read)、写(write)、执行(exe)。比如chmod a+x filname 表示对所有用户增加对filename的执行权限。

2、数字模式
直到现在为止,我们使用了叫做“符号”的模式来用 chmod 指定权限的改变。然而,指定权限还有一种普遍使用的方法 — 使用 4 位八进制数。使用叫做数字权限语法的语法,每一位代表一个权限三元组。例如,在 1777 中,777 设置本章我们所讨论的“owner”、“group”和“other”标志。1 用来设置专门的权限位,我们将在本章的结束部分讲到。下面说明了怎样解释第二到四位(777):

模式 数字
rwx 7
rw- 6
r-x 5
r-- 4
-wx 3
-w- 2
--x 1
--- 0

数字权限语法
当需要给一个文件指定所有权限时,数字权限语法特别有用,比如在下面的示例中:
$ chmod 0755 scriptfile.sh
$ ls -l scriptfile.sh
-rwxr-xr-x  1 drobbins drobbins    0 Jan 9 17:44 scriptfile.sh

在该示例中,我们使用了 0755 模式,它展开为一个完整的权限设置“-rwxr-xr-x”。这种方法是对过设定文件的权限位来修改权限的。这里的7=4+2+1=2^2+2^1+2^0=111B (^表示乘方,B表示二进制数)5=4+1

这种方法比上一种方法用得广泛。其它umask就是一种方法。umask是一种文件创建权限掩码,当新文件被创建时,其最初的权限由文件创建掩码决定。权限掩码和777相减得到最初的权限值。

权限的运算:
权限的运算是二进制的运算,而不是十进制的运算。这其中的偶数-奇数就须要注意。6-3=4而不等于3。原因是这样的:
化成二进制:110B
-011B,做的时候是相应位相减。110B(代表rw-)
-011B(代表-wx)
=100B

要注意这个0。因为原来的权限中根本就没有x这一权限。所以最后就变成了0。如果按照6-3=3,反而是增加了x权限而取消了r的权限位。还有SUID,SGID和Stickybit也分别代表了三个位,分别是 100B=4,010B=2和001B=1,chmod 0775中0就表示没有SUID、SGID(这两项是非常危险的,尽量不要使用)和Sticky bit的设置。

umask
当进程创建了新文件时,它指定新文件应该具有的权限。通常,所请求的模式是 0666(每个人可读和可写),它比我们希望的具有更多的权限。幸运的是,不管什么时候创建了新文件,Linux 将参考叫做“umask”的东西。系统用 umask 值来将初始指定的权限降低为更合理、更安全的权限。您可以通过在命令行中输入 umask 来查看当前的 umask 设置:
$ umask
0022

在Linux系统上,umask 的缺省值一般为 0022,它允许其他人读您的新文件(如果他们可以得到它们),但是不能进行修改。为了在缺省的情况下使新文件更安全,可以改变 umask 设置: $ umask 0077,umask 将确保组和其他用户对于新创建的文件绝对没有任何权限。那么,umask 怎样工作呢?与文件的“常规”权限不同,umask 指定应该关闭哪一个权限。我们来参阅一下我们的“模式到数字”映射表,从而使我们可以理解 0077 的 umask 的意思是什么:0077 的最后三位扩展为 ---rwxrwx。现在,请记住 umask 告诉系统禁用哪个权限。根据推断,我们可以看到将关闭所有“组”和“其他”权限,而“用户”权限将保留不动。

suid/sgid
幸好,Linux 权限模型有两个专门的位,叫做“suid”和“sgid”。当设置了一个可执行程序的“suid”这一位时,它将代表可执行文件的所有者运行,而不是代表启动程序的人运行。现在,回到 /etc/passwd 问题。如果看一看 passwd 可执行文件,我们可以看到它属于 root 用户:
$ ls -l /usr/bin/passwd
-rwsr-xr-x 1 root wheel  17588 Sep 24 00:53 /usr/bin/passwd

还会注意到,这里有一个 s 取替了用户权限三元组中的一个 x。这表明,对于这个特殊程序,设置了 suid 和可执行位。由于这个原因,当 passwd 运行时,它将代表 root 用户执行(具有完全超级用户访问权),而不是代表运行它的用户运行。又因为 passwd 以 root 用户访问权运行,所以能够修改 /etc/passwd 文件,而没有什么问题。

suid/sgid告诫
我们看到了suid怎样工作,sgid以同样的方式工作。它允许程序继承程序的组所有权,而不是当前用户的程序所有权。这里有一些关于 suid 和 sgid 的其它的但是很重要的信息。首先,suid 和 sgid 占据与 ls -l 清单中 x 位相同的空间。如果还设置了 x 位,则相应的位表示为 s(小写)。但是,如果没有设置 x 位,它将表示为 S(大写)。另一个很重要的提示:在许多环境中,suid 和 suid 很管用,但是不恰当地使用这些位可能使系统的安全遭到破坏。最好尽可能地少用“suid”程序。passwd 命令是为数不多的必须使用“suid”的命令之一。

改变 suid 和 sgid
设置和除去 suid 与 sgid 位相当简单。这里设置 suid 位:
# chmod u+s /usr/bin/myapp

此处,从一个目录除去 sgid 位。将看到 sgid 位怎样影响下面几屏中的目录:
# chmod g-s /home/drobbins

权限和目到此为止,我们从常规文件的角度来看权限。当从目录的角度看权限时,情况有一点不同。目录使用同样的权限标志,但是它们被解释为表示略微不同的含义。对于一个目录,如果设置了“read”标志,可以列出目录的内容;“write”表示您可以在目录中创建文件,“execute”表示您可以进入该目录并访问内部的任何子目录。没有“execute”标志,目录内的文件系统对象是不可访问的。没有“read”标志,目录内的文件系统对象是不可查看的,但是只要有人知道磁盘上对象的完整路径,就仍然可以访问目录内的对象。目录和 sgid如果启用了目录的“sgid”标志,在目录内创建的任何文件系统对象将继承目录的组。当需要创建一个属于同一组的一组人使用的目录树时,这种特殊的功能很管用。只需要这样做:
# mkdir /home/groupuse
# chgrp sgroup /home/groupuse
# chmod g+s /home/groupuse

现在,sgroup 组中的所有用户都可以在 /home/groupuse 内创建文件或目录,同样也将自动地分配到 sgroup 的组所有权。根据用户的 umask 设置,新文件系统对象对于 sgroup 组的其他成员来说,可以或不可以是可读、可写或可执行的。目录和删除缺省情况下,Linux 目录以一种不是在所有情况下都很理想的方式表现。一般来说,只要对一个目录有写访问权,任何人都可以重命名或删除该目录中的文件。对于个别用户使用的目录,这种行为是很合理的。但对于很多用户使用的目录来说,尤其是 /tmp 和 /var/tmp,这种行为可能会产生麻烦。因为任何人都可以写这些目录,任何人都可以删除或重命名任何其他人的文件 — 即使是不属于他们的!

显然,当任何其他用户在任何时候都可以输入“rm -rf /tmp/*”并损坏每个人的文件时,很难把 /tmp 用于任何有意义的文件。所幸Linux有叫做“粘滞位”(sticky bit)的东西,当给 /tmp 设置了粘滞位(用 chmod +t),唯一能够删除或重命名 /tmp 中文件的是该目录的所有者(通常是 root 用户)、文件的所有者或 root 用户。事实上,所有 Linux 分发包都缺省地启用了 /tmp 的粘滞位,还可以发现粘滞位在其它情况下也很管用。


设置系统umask值解决不常见权限问题

Setup OpenSSH's umask to 0027 in a consistent way across all connection types.By connection types I'm referring to:sftp、scp、ssh

This was added to /etc/pam.d/common-session:
session    optional     pam_umask.so

This was modified in /etc/login.defs:
UMASK 0027

与umask涉及的相关文件:
~/.profile -> umask=0002
~/.bashrc -> umask=0002
/etc/profile -> umask=0002
/etc/pam.d/common-session -> umask=0002
/etc/pam.d/sshd -> umask=0002
/etc/pam.d/login -> umask=0002

另外的'sshfs'设置连接掩码:
sshfs -o idmap=user -o umask=0113 user@server:/home/ /mnt

ACLs should work fine for you.

Set a default ACL on all folder for the group, which will then be inherited by all future files and directories.

Something like setfacl -m d:g:uploaders:rwx should work.

You can setup umask in /etc/bashrc or /etc/profile file for all users. By default most Linux distro set it to 0022 (022) or 0002 (002). Open /etc/profile or ~/.bashrc file, enter:
# vi /etc/profile
OR
$ vi ~/.bashrc

Append/modify following line to setup a new umask:
umask 022

Save and close the file. Changes will take effect after next login. All UNIX users can override the system umask defaults in their /etc/profile file, ~/.profile (Korn / Bourne shell) ~/.cshrc file (C shells), ~/.bash_profile (Bash shell) or ~/.login file (defines the user's environment at login).

关于八进制的umask模式'022'与'002'

The default umask 002 used for normal user. With this mask default directory permissions are 775 and default file permissions are 664.
The default umask for the root user is 022 result into default directory permissions are 755 and default file permissions are 644.
For directories, the base permissions are (rwxrwxrwx) 0777 and for files they are 0666 (rw-rw-rw).

In short,
A umask of 022 allows only you to write data, but anyone can read data.
A umask of 077 is good for a completely private system. No other user can read or write your data if umask is set to 077.
A umask of 002 is good when you share data with other users in the same group. Members of your group can create and modify data files; those outside your group can read data file, but cannot modify it. Set your umask to 007 to completely exclude users who are not group members.

Calculate umasks?
The octal umasks are calculated via the bitwise AND of the unary complement of the argument using bitwise NOT. The octal notations are as follows:
Octal value : Permission
0 : read, write and execute
1 : read and write
2 : read and execute
3 : read only
4 : write and execute
5 : write only
6 : execute only
7 : no permissions

Now, you can use above table to calculate file permission. For example, if umask is set to 077, the permission can be calculated as follows.

Set umask Using Symbolic Values?
The following symbolic values are used:
r : read
w : write
x : execute
u : User ownership (user who owns the file)
g : group ownership (the permissions granted to other users who are members of the file's group)
o : other ownership (the permissions granted to users that are in neither of the two preceding categories)

碰到一个关于设置umask的问题:由于系统使用了ldap方式的用户认证,要满足一个用户上传了文件,另外一个用户可以去修改的需求,于是将他们的组设置为同一个组下。问题于是出现了,系统默认的掩码为'022',这样当一个用户新建文件后,另外一个用户却不能修改,要么手动修改其权限,要么重新设置umask来实现。在debian下通常在用户的主目录下的.bash_profile文件设置即可,而red hat系下却不行。仔细分析发现系统的/etc/profile及/etc/bashrc中有如下一段代码:
if [ $UID -gt 99 ] && [ "`id -gn`" = "`id -un`" ]; then
 umask 002
else
 umask 022
fi

正是这段代码,用户id要在100以上,且组名与用户名相同的情况下才能将掩码设为'002',而此类用户的组名一般与用户名不同,所以导致了此类问题。处理方法:可简单的修改这段代码来解决。

Linux特殊权限位之setuid、setgid和sticky

创建一个普通文件或者目录的时候会有一个默认的权限。普通文件是644,目录文件是755,这个是由umask这个值决定的。我们可以直接执行umask命令查看,linux系统默认的umask值是0022。想改变创建文件默认的权限,我们直接修改umask就可以,但是一般的权限都是通过777-022得到的默认权限位。022前面的这个0是什么呢?第一个0就是特殊权限位,下边跟大家说一下setuid、setgid和sticky这个三个特殊权限位。

1.suid,set uid:在一个程序或命令上添加setuid以后(u+s),这样属主有了s权限,意味着任何用户在执行此程序时,其进程的属主不再是发起者本人,而是这个程序的属主。最典型的一个例子就是passwd这个命令。

The setuid bit

When the setuid bit is used, the behavior described above it's modified so that when an executable is launched, it does not run with the privileges of the user who launched it, but with that of the file owner instead. So, for example, if an executable has the setuid bit set on it, and it's owned by root, when launched by a normal user, it will run with root privileges. It should be clear why this represents a potential security risk, if not used correctly.

An example of an executable with the setuid permission set is passwd, the utility we can use to change our login password. We can verify that by using the ls command:
ls -l /bin/passwd
-rwsr-xr-x. 1 root root 27768 Feb 11  2017 /bin/passwd

How to identify the setuid bit? As you surely have noticed looking at the output of the command above, the setuid bit is represented by an s in place of the x of the executable bit. The s implies that the executable bit is set, otherwise you would see a capital S. This happens when the setuid or setgid bits are set, but the executable bit is not, showing the user an inconsistency: the setuid and setgit bits have no effect if the executable bit is not set. The setuid bit has no effect on directories.

普通用户运执行passwd命令来修改自己的密码,其实最终更改的是/etc/passwd这个文件。我们知道/etc/passwd文件是用户管理的配置文件,只有root权限的用户才能更改。

# ls -l /etc/passwd
-rw-r--r-- 1 root root 529 3月   9 18:09 /etc/passwd

按照常规的逻辑思维,普通用户是修改不了/etc/passwd此文件的,但是在passwd这个命令上添加了setuid这个特殊权限位,普通账号临时变成root,就能间接修改自己账号的密码了。

# ls -l /usr/bin/passwd (s就是suid位)
-rwsr-xr-x 1 root root 56872 11月 17  2015 /usr/bin/passwd

设置setuid的方法:(其实前边提到过了参数是u+s)
# chmod u(+|-)s /path/somefile
# chmod 4664 /path/somefile

注意:
s:表示属主原来有执行权限
S:表示属主原来没有执行权限

注意:设置suid这个特殊权限很危险,不得已还是不要使用。

2.sgid,set id,属组有s权限,意思就是执行此程序时,此进程的属组不再是运行者本人所属的基本组,而是此程序文件的属组。set gid权限如果给文件设置,是让运行此文件的其它用户具有这个文件的属组特性;给目录设置set gid权限,任何用户在该目录下创建的文件,则该文件属组都和目录的属组一致。

The setgid bit

Unlike the setuid bit, the setgid bit has effect on both files and directories. In the first case, the file which has the setgid bit set, when executed, instead of running with the privileges of the group of the user who started it, runs with those of the group which owns the file: in other words, the group ID of the process will be the same of that of the file.

When used on a directory, instead, the setgid bit alters the standard behavior so that the group of the files created inside said directory, will not be that of the user who created them, but that of the parent directory itself. This is often used to ease the sharing of files (files will be modifiable by all the users that are part of said group). Just like the setuid, the setgid bit can easily be spotted (in this case on a test directory):
ls -ld test
drwxrwsr-x. 2 egdoc egdoc 4096 Nov  1 17:25 test

This time the s is present in place of the executable bit on the group sector.

设置后可以成功写进去,这就是因为在/tmp/test文件设置了sgid权限位;但是这个不但可以能成功写进去,还可以删除文件,我们只能自己删除自己的文件,不想让其他用户删除我们的文件,这时候怎么办呢?

3.这时候就用到了粘滞位,(t,sticky),附加other的权限上,表现为t。
# chmod o+|-t /path/somefile

可以添加和任意修改其他用户的文件,就是不能删除其他用户的文件,自己可以删除自己创建的文件。

The sticky bit

The sticky bit works in a different way: while it has no effect on files, when used on a directory, all the files in said directory will be modifiable only by their owners. A typical case in which it is used, involves the /tmp directory. Typically this directory is writable by all users on the system, so to make impossible for one user to delete the files of another one, the sticky bit is set:
$ ls -ld /tmp
drwxrwxrwt. 14 root root 300 Nov  1 16:48 /tmp

In this case the owner, the group, and all other users, have full permissions on the directory (read, write and execute). The sticky bit is identifiable by a t which is reported where normally the executable x bit is shown, in the "other" section. Again, a lowercase t implies that the executable bit is also present, otherwise you would see a capital T.

表示方法:将三个特殊位的用八进制数值表示,放于 u/g/o 位之前,其中:suid:4 sgid:2 sticky:1。

文件的粘滞位(sticky)位是作什么用的:普通文件的sticky位会被linux内核忽略,目录的sticky位表示这个目录里的文件只能被owner和root删除。

粘着位(Sticky bit)
如果用户对目录有写权限,则可以删除其中的文件和子目录,即使该用户不是这些文件的所有者,而且也没有读或写许可。粘着位出现执行许可的位置上,用t表示,设置了该位后,其它用户就不可以删除不属于他的文件和目录。但是该目录下的目录不继承该权限,要再设置才可使用。

举一个linux下的常见目录来做例子,也就是 /tmp 目录来说一下粘连位的作用。
# ls -dl /tmp
drwxrwxrwt 4 root    root  ...
注意other位置的t,这便是粘连位。都知道/tmp常被我们用来存放临时文件,是所有用户。但是我们不希望别的用户随随便便的就删除了自己的文件,于是便有了粘连位,它的作用便是让用户只能删除属于自己的文件。

那么原来的执行标志x到哪里去了呢? 系统是这样规定的,假如本来在该位上有x,则这些特别标志 (suid, sgid, sticky) 显示为小写字母(s, s, t),否则显示为大写字母 (S, S, T) 。
chmod 777 freeoa
chmod +t freeoa
等价于
chmod 1777 freeoa

在以前旧的系统当中如果一个程序文件一旦设置了粘着位,那么当该程序中止的时候他的所有指令段将被保存到系统的交换分区当中,再次运行时可以更快的调入系统。不过现在的操作系统已经不再使用这种功能了,但这并不表示这一功能已经完全被废弃,当一个目录设置为粘着位时,它将发挥特殊的作用。即当一个目录被设置为"粘着位"(用chmod a+t),则该目录下的文件只能由
1、超级管理员删除
2、该目录的所有者删除
3、该文件的所有者删除

也就是说即便该目录是任何人都可以写但也只有文件的属主才可以删除文件。


修改指令的参考

chmod:更改文件权限
语法:chmod <选项> <参数>
选项:
-c或--changes # 效果类似"-v"参数,但仅回报更改的部分
-f或--quiet或--silent # 不显示错误信息
-R或--recursive # 递归处理,将指令目录下的所有文件及子目录一并处理
-v或--verbose # 显示指令执行过程
--reference=<参考文件或目录> # 把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同

参数:
权限模式 # 指定文件的权限模式
文件 # 要改变权限的文件

实例:
# 第一种方式:+、-、=变更权限
# u:所有者,g:所有组,o:其他人,a:所有人(u、g、o总和)
chmod u=rwx,g=rx file # 表示该文件者拥有读、写、执行权限,同一用户组拥有读、执行权限,其他人未设置拥有之前的权限
chmod g+w file # 表示该文件在原权限上添加同一用户组可写权限
chmod a-x file # 表示该文件在原权限上取消所有人的执行权限
# 第二种方式:通过数字变更权限
# r=4 w=2 x=1 -=0 如:rwx=4+2+1=7
chmod 755 file # 相当于chmod u=rwx,g=rx,o=rx file

chown:更改文件所有者
语法:chown <选项> <参数>
选项:
-c或--changes # 效果类似"-v"参数,但仅回报更改的部分
-f或--quite或--silent # 不显示错误信息
-h或--no-dereference # 只对符号连接的文件作修改,而不更改其他任何相关文件
-R或--recursive # 递归处理,将指定目录下的所有文件及子目录一并处理
-v或--version # 显示指令执行过程
--dereference # 效果和"-h"参数相同
--reference=<参考文件或目录> # 把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同

参数:
用户:组 # 指定所有者和所属工作组。当省略":组",仅改变文件所有者
文件 # 指定要改变所有者和工作组的文件列表。支持多个文件和目标,支持shell通配符
实例:
chown tom file # 改变文件的所有者
chmod tom:group file # 改变用户的所有者和所有组

chgrp:更改文件所在组
语法:chgrp <选项> <参数>
选项:
-c或--changes # 效果类似"-v"参数,但仅回报更改的部分
-f或--quite或--silent # 不显示错误信息
-h或--no-dereference # 只对符号连接的文件作修改,而不更改其他任何相关文件
-R或--recursive # 递归处理,将指定目录下的所有文件及子目录一并处理
-v或--version # 显示指令执行过程
--reference=<参考文件或目录>  # 把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同
参数:
组 # 指定新工作名称
文件 # 指定要改变所属组的文件列表。多个文件或者目录之间使用空格隔开
实例:
chgrp group file # 改变文件的所有组


该文章最后由 阿炯 于 2021-11-18 13:49:56 更新,目前是第 2 版。