Linux文件的基本权限有9个,分别是user,group,others三种身份各自的三种权限:r (read,读),w (write,写),x (execute,执行)。
其中,可以用数字来代表各个权限:
r : 4
w : 2
x : 1
目录与文件的权限意义:
1):文件是实际存放数据的地方,包括一般文本文件、数据库内容文件、二进制可执行文件等。因此权限对于文件来说,它的意义如下:
r(read):可读取此文件的实际内容,如读取文本文件的文字内容等。
w(write):可以编辑,新增或者是修改该文件的内容(但不可以删除该文件)。
x(execute):该文件可以被系统执行。
在Linux下,文件能否被执行是由是否具有'x'权限来决定的,跟文件名是没有绝对的关系的。
2):目录主要的内容是记录文件名列表,文件名与目录有很重要的的关联。因此,权限对于目录的意义如下:
r(read contents in directory):表示具有读取目录结构列表的权限,当拥有一个目录的'r'权限时,可以查询该目录下的文件名数据。
w(modify contents of directory):表示具有更改该目录结构列表的权限,也就是说具有以下权限:
1> 在该目录下新建新的文件或目录。
2> 在该目录下删除已经存在的文件与目录(不论该文件权限为何)。
3> 在该目录下将已存在的文件或目录进行重命名。
4> 转移该目录内的文件或目录位置。
x(access directory):表示可以执行该目录,即拥有此权限的用户可以进入该目录成为工作目录( work directory ,所谓的工作目录就是用户目前所在的目录)。
工作目录对于命令的执行是很重要的,如果用户对于某个目录没有'x'权限,该用户就无法切换到该目录下,也就无法执行该目录下的命令,即使用户拥有该目录的'r'和'w'权限。
在Linux下,一个文件能否被用户删除,与用户对该文件的权限并没有关系,只与用户对于该文件所在目录的权限有关,如果用户拥有该文件所在目录的'w'权限,则无论该文件的权限为何,用户都可以删除、移动或重命名这个文件。
改变文件权限的命令:chmod
chmod命令有两种更改文件权限的方式:
1> 数字类型改变文件权限:
上文提到文件的权限可以用数字代表,故文件的9个基本权限可以用三位数字来表示,比如一个文件的权限为 "rwxr-xr--" ,此文件所对应三种身份的权限分别为,user=rwx=4+2+1=7,group=r-x=4+0+1=5,
others=r--=4+0+0=4。
如果想要使用chmod改变文件的权限,可以用数字指定需要设置的权限,如 "rwxrw-r--" 可以用数字764表示,所以命令应写作:chmod 764 文件名。
2> 符号类型改变文件权限:
类似于数字类型,基本权限的三种身份可以用符号来代替:user=u,group=g,others=o,此外可以用a( all )来表示全部身份。同理,基本权限可以用r ,w,x表示。然后可以用下表的方式使用命令:
chmod | u g o a | + (加入) - (除去) = (设置) | r w x | 文件名 |
假如想要设置一个文件(test)的权限为 "rwxrw-r--" 时,可以使用命令:chmod u=rwx,g=rw-,o=r-- test
如果想要将该文件的权限改为 "rw-r--rw-" 可使用命令:chmod u-x,g-w,o+w test 如果想要将该文件权限改为
"r--r--r--" 可使用命令:chmod a-w test 设置即可。
默认权限:
在Linux下,新建一个文件的初始权限与umask有关,umask就是指定 "目前用户在新建文件或目录的权限默认值" 可以调用umask命令来查看目前系统设置的权限默认值(加上-S参数可以以符号形式显示)。
需要注意的是,umask的分数值指的是 "需要除去的权限" ,而umask -S 显示的符号形式指的是"目前新建文件的默认权限" ,每当新建一个文件时,系统会对文件的初始指定权限 (比如open函数使用O_CREAT参数时需要指定新建文件的初始权限) 根据默认权限进行修改,修改方式为: "初始权限&~umask" 。
例如新建文件的指定权限为 "0777" 而当前的umask为 "0002",则新建文件的实际权限为 "0775" ,即进行 "0777&~0002" 位运算操作。
隐藏权限:
当我们使用ls命令查看 /tmp目录和 /usr/bin/passwd 的属性的时候会发现,这两个文件的权限有些与众不同
从上图可以看到,两个文件的文件名被加上了颜色,同时 /tmp 目录的others身份的 'x' 权限变成了 't' ,而/usr/bin/passwd 文件的user身份的 'x' 权限变成了 's' ,这就说明这两个文件的权限中含有特殊权限,也即我们要说的隐藏权限:
在Linux下,除了r,w,x三个权限以外还有三种特殊的文件权限:SUID,SGID,SBIT。
SetUID
当 's' 标志出现在文件user身份的x权限位上,此时就被称为Set UID,简称SUID的特殊权限,对一个文件来说,SUID有以下的限制与功能:
1> SUID权限仅对二进制程序 (binary program ) 有效。
2> 执行者对于该程序需要具有x的可执行权限。
3> 本权限仅在执行该程序的过程中 (run-time) 有效。
4> 执行者将具有该程序所有者的权限。
总的来说,如果一个二进制程序拥有SUID权限,当某用户运行此程序,只要该用户拥有对此程序的 'x' 权限,则在执行该程序的过程中都将暂时的获得该程序文件所有者的权限。
例如上文中的 /usr/bin/passwd 文件就拥有SUID权限,此文件是一个二进制程序,也就是用户用来修改密码的命令,用户的密码都保存在 /etc/shadow 文件中,可以用ls命令查看此文件的属性:
从图中可以看到,此文件只有root用户可以强制修改其中的数据,但是在日常使用中,每个用户都可以通过passwd命令修改用户密码,这就是因为 passwd 拥有SUID权限,在 passwd 程序的运行过程中,调用此命令的用户将会暂时获得root的权限,所以 /etc/shadow 可以被普通用户所执行的 passwd 所修改,所对应的可以用 cat 命令来对比,因为 cat 命令没有SUID权限,所以普通用户在执行 cat 命令时,会出现权限不够,无法查看的情况。
SetGID
当 's' 标志出现在文件group身份的x权限位时,说明该文件在用户组中Set GID,简称SGID。与SUID不同的是,SGID可以针对文件或目录来设置。 如果是对于文件来说,SGID拥有如下功能:
1> SGID对二进制程序有效。
2> 程序执行者对于该程序来说,需要拥有同用户组的 'x' 权限。
3> 执行者在执行的过程中将会获得该程序用户组的权限。
SGID对于文件的功能类似于SUID。但除了二进制程序之外,SGID也能够用在目录上,当一个目录设置了SGID的权限后,它将拥有如下功能:
1> 用户如果对此目录具有 'r' 和 'x' 的权限时,该用户能够进入此目录。
2> 用户在此目录下的有效用户组 (effective group) 将会变成该目录的用户组。
3> 若用户在此目录下拥有 'w' 权限 (可以新建文件) ,则用户所创建的新文件的用户组与此目录的用户组相同。
SGID对于目录的功能在多用户开发项目的时候将会非常有用。
Sticky Bit
当 't' 标志出现在目录的others身份的x权限位时,说明该目录拥有SBIT权限。目前SBIT只对目录有效,SBIT对于目录的规则及作用如下:
1> 用户对于此目录拥有 'w' 和 'x' 权限,即具有写入的权限。
2> 当用户在该目录下创建文件或目录时,仅有自己与root才有权力删除该文件。
换句话说:当用户在某个目录下是用户组或其他人的身份,并且拥有该目录的 'w' 权限,那么该用户在此目录下可以对任何人新建的文件或目录进行删除删除,重命名,移动等操作。但如果此目录加上了SBIT权限时,该用户就只能够针对自己创建的文件或目录进行删除,重命名,移动等操作,而无法删除其他人的文件 (其他用户也是如此,所以说在设置了SBIT权限的目录下任何用户所新建的文件或目录只有自己和root才有权力删除)。
举个例子说明:/tmp 这个目录本身的权限是 "drwxrwxrwt" ,在这样的权限下,任何用户都可以在 /tmp 目录下添加,修改文件,但是只有文件或目录的创建者及root可以删除自己所创建的文件或目录,如果用户A在 /tmp 目录下新建了test文件,并将test文件的权限改为"777",则另一个用户B可以对test进行修改,但是却无法删除test。
SUID/SGID/SBIT权限的设置:
在上文的默认权限部分,使用umask命令显示的默认权限可以看到显示的权限位是4位,后面3位对应user,group,others三种身份,而第1位就是特殊权限位,同样可以用数字表示:
SUID:4
SGID:2
SBIT:1
特殊权限的设置类似于基本权限,也可以使用chmod命令来修改,例如要将一个文件的权限设置为
"-rwsr-xr-x" 时,由于 's' 出现在文件所有者权限位中,所以表示的时SUID权限,则需要将4添加在基本权限之前,即"4755",也就是使用 chmod 4755 filename 来设置。
需要注意的是:有时会出现 大写的 'S' , 'T' 权限出现,例如 使用 chmod 7666 filename 命令产生的文件权限为:"-rwSrwSrwT" ,很容易就可以看出,该文件的三种身份都不具备 'x' 权限,而这种大写的 'S' 'T' 就是表示此文件没有执行的权限,也即表示"空的",比如SUID的作用是在该文件执行的时候具有文件所有者的权限,但是文件所有者都没有执行的权限,又哪里来的权限给他人使用?所以这里说 'S' 'T' 代表的是空。