权限的理解
从整体来看,在Linux系统下存在两种用户,一种是超级用户,也就是管理员用户,另一种是普通用户。显而易见点的是这两种用户的受到的限制是不一样的,可以将权限粗略地理解为——用户是否具备进行某种操作的能力。用户间的切换可以采用 su [用户名]指令来进行。
文件权限管理
从文件访问者的角度来看,存在三种文件访问者:
1,u--user
2,g--group
3,o--other
如上图所示,最前面的十个字符代表的是文件的访问权限与文件的类型。
第一位表示文件类型:d表示目录,-表示普通文件,l表示软链接(类似Windows的快捷方式),b表示块设备文件(例如硬盘,光驱),p表示管道文件,c表示字符设备文件(例如屏幕),s表示套接口文件。
后九位每三位为一组,分别表示文件所属者的权限,文件所属者所在的组的权限,其他用户的权限。
举个形象的例子就是:林三是文件的所属者,他在一家公司打工,这个公司有几个组相互竞争,林三不想让其他人有访问文件的权限,但想让自己的组员可以访问权限,这个时候他的组员就有了“文件所属者所在的组”的权限。
r对文件而言表达的是读取文件内容的权限,对目录而言表达的是浏览目录信息的权限
w对文件而言表达的是修改文件内容的权限,对目录而言表达的是删除或者移动文件的权限
x对文件而言表达的是执行文件的权限,但值得注意的是文件是否是可执行文件;对目录而言表达的是能否进入目录的权限。
这样一来,我们就可以用八进制来表达这些权限,例如111表达的是rwx,可读可写可执行文件,101表达的是r-w,可读不可写可执行文件。
文件访问权限的设置方法
chmod [参数] 权限 文件名
权限字符
+:向权限范围增加权限符号所代表的权限
- :向权限范围取消权限符号所代表的权限
=:向权限范围赋予权限符号所代表的权限
用户符号
u:拥有者
g:拥有者所属组
o:其他用户
a:所有用户
举例
# chmod u+w /home/abc.txt
# chmod o-x /home/abc.txt
除此之外,我们还可以通过八进制直接更改多个类别的用户权限
比如说:# chmod 640 /home/abc.txt
更改文件拥有者的命令
chgrp [参数] 用户组名 文件名
更改文件拥有者所属组的命令
chgrp [参数] 用户组名 文件名
umask
新建文件默认权限=0666
新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。
原因就是创建文件或目录的时候还要受到 umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & ~umask。
在这行命令mask & ~umask
中,&
和~
是位运算符,用于对文件权限掩码进行操作。
-
&
运算符是位与(AND)运算符:- 当对两个二进制数字进行位与运算时,如果相应的位都是1,则结果的相应位为1;否则,结果的相应位为0。
-
~
运算符是按位取反(NOT)运算符:- 当对一个二进制数字进行按位取反运算时,所有的0将变为1,所有的1将变为0。
在Linux中,文件权限由一个3位的掩码来表示,即读取(r)、写入(w)和执行(x)权限,分别用数字表示为4、2和1。例如,读取和写入权限被表示为6(4 + 2),读取和执行权限被表示为5(4 + 1)。
umask
是一种权限掩码,用于在创建新文件时从默认权限中去除某些权限。默认情况下,新创建的文件会继承一定的权限,但umask
允许通过禁用一些权限来增加文件的安全性。
所以,mask & ~umask
这行命令将对mask
(文件权限掩码)和umask
(要去除的权限掩码)进行按位与和按位取反运算,从而得到新的权限掩码,用于限制文件的访问权限。
超级用户默认掩码值为0022,普通用户默认掩码值为0002
file指令
file [选项] 文件或目录
用来辨别文件的类型,常用选项:
-c 详细显示指令执行过程,便于排错或分析程序执行的情形。
-z 尝试去解读压缩文件的内容
使用sudo分配权限
$ sudo –u 用户名 命令
实例:$sudo -u root /usr/sbin/useradd u2
粘滞位
为何要有粘滞位?
不妨设想一个情景:林三对一个文件设置了权限,将其他用户的权限设置为000,也就是说对文件无法进行任何的读写操作。此时王五对于自己被隔绝在外心怀不满,于是直接将这个文件给删除了,这岂不是十分地不妙。
基于这一点,粘滞位应运而生。
当一个目录被设置为"粘滞位"(用chmod +t),
则该目录下的文件只能由
一、超级管理员删除
二、该目录的所有者删除
三、该文件的所有者删除