一、权限表示方式
rwx
执行ls -l
,可以看到文件或目录前都有类似drwxr-xr-x
的符号
其中第一位,d表示目录,后面9位表示文件的权限设置,其中前3位是所属用户权限,中间3位是所属组权限,后3位是其它用户权限
文件权限可以用符号模式,表示为rwx
,分别表示读、写、执行权限,没有某种权限用“-”表示,比如只有读和执行权限,则为r-x
文件权限也可以用数字模式,其中r=4,w=2,x=1,表示时将拥有的权限数值相加,比如rwx
为4+2+1=7,r-x
则为4+1=5,一个文件完整权限rwxr-xr--
则可以表示为754
用户对文件的操作权限
权限标志后面有两个名字,比如drwxr-x--- 7 ccb1 ccb2
中的ccb1和ccb2,ccb1表示文件所属用户,ccb2表示文件所属组
结合前面的文件权限标志,可以识别用户对文件是否有相应的操作权限
比如前面文件所属用户是ccb1,对应的权限标志是rwx
,则ccb1用户对该文件有读、写、执行权限;
而文件所属组是ccb2,对应的权限标志是r-x
,则表示如果一个用户在ccb2组里,则该用户对该文件有读和执行权限
(注:执行权限一般是对二进制文件来说的,脚本文件一般没有执行权限,只对读权限进行判断,比如一个py文件,要用python执行该文件时,需判断是否有读权限)
二、文件权限的修改
chmod
使用chmod指令可以修改文件权限
- 符号模式
用符号表示要改的权限和行为:
u:用户,g:组,o:其它,a:所有(即包含以上三种)
+:赋予,-:移除,=:设置
比如文件a.txt原权限为r-xr-xr-x
,执行chmod u+w a.txt
,则对用户权限加上了 写权限,变为rwxr-xr-x
- 数字模式
直接设置完整权限,比如chmod 750 a.txt
chmod支持-R参数,表示递归设置目录下所有文件权限
chmod只有文件所属用户或root可执行
chown
使用chown可以改变文件所属用户
比如chown ccb1:ccb2 a.txt
,则将a.txt所属用户设置为ccb1,所属组设置为ccb2
chown支持-R参数,表示递归设置目录下所有文件权限
chown只有root可执行
三、对文件操作的权限判断依据
读文件
需要对文件及其以上的所有成绩目录都有读权限
如:读取a/b/c,需要对a、b、c都有读权限
写文件
需要对文件有写权限,并对其以上的所有层级目录都有读权限
如:写入a/b/c,需要对c有写权限,并对a、b有读权限
增删文件
需要对其所在的目录有写权限,并对该目录以上的所有层级目录有读权限
如:在a/b目录下增删c,需要对b有写权限,并对a有读权限
执行文件
需要对其所在文件有执行权限,并对其以上的所有层级目录有读权限
如:执行a/b/c,需要对c有执行权限,并对a、b有读权限
路径包含软链接的情况
如果操作的文件路径包含软链接,除了对路径所有目录层级判断权限外,还需要判断软链接指向的真实路径的所有目录层级的权限
如:写入a/b/c,其中b是软链接,指向d/e,则需要对c有写权限,并对a、b有读权限,同时也要对d、e有读权限
四、特殊权限
u+s
执行chmod u+s 文件路径
进行设置
用户权限的x位会变为s,如rwsr-xr--
正常通过可执行文件启动进程,进程的拥有者为执行指令的用户,使用chmod设置了文件用户权限的s标记,则使用该文件启动的进程的拥有者为文件拥有者
这个标记对二进制文件有效,对脚本是无效的
g+s
执行chmod g+s 目录路径
进行设置
组权限的x会变为s,如rwxr-sr--
使用chmod对目录设置了组的s标记后,在目录下新创建的文件默认继承该目录的所属组
o+t
执行chmod o+t 文件路径
进行设置
其它用户权限的x位会变成t,如rwxr-xr-t
使用chmod对文件设置其它用户的t标记后,只有root和文件所属用户可以删除此文件
数字模式
与rwx的数字模式类似
u+s
为4,g+s
为2,o+t
为1,相加值表示要设置的权限,数值加载rwx
的数值前
比如chmod 5770 文件路径
,第一位的5表示设置u+s
和o+t
,后面的770则为rwx的数字表示,转为符号模式表示则为rwsrwx--t
(注:使用chown后,原先设置的特殊权限标志会消失)
五、改变进程权限(su和sg的用法)
su
root用户启动的shell进程,可以用su指令使用另一个用户权限启动子进程,其它用户执行su切换时则需要密码
格式:su - 用户名 -c 子进程启动指令
举例:su - ccb1 -c "python abc.py"
,如此启动的子进程abc.py则会是ccb1用户权限
sg
进程运行期间,进程所属用户进入了新的用户组,这个权限变化是无法在该进程生效的。若要使用心的组权限,一个方法是重启进程,但若不想重启进程,可以使用sg指令指定组名启动子进程,该子进程则会拥有该组权限
注:指定的组名必须是用户确实已进入的用户组,相当于是给子进程更新了用户的组权限,而不是新增组权限
格式:sg 组名 -c 子进程启动指令
举例:进程运行期间,ccb1用户加入了ccb2组,进程可执行sg ccb2 -c "python abc.py"
,则abc.py有了ccb2组权限,可以对ccb2组可操作的文件执行相应操作
不管是su还是sg,都不是真正改变原进程权限,而是让子进程的权限与父进程不同