基本权限
Linux文件系统的基本权限有四个标识:r(readable)
、w(writable)
、x(executable)
以及-(none)
。
# 查看/etc目录的权限
[root@wqh06 ~]# ll -d /etc
drwxr-xr-x. 76 root root 8192 Apr 4 10:46 /etc
# 分解第一列字符
d rwx r-x r-x .
# 目录 属主权限位(U) 属组权限位(G) 其他用户权限位(O) 与selinux有关
# U,G,O 即 User,Group,Other
# 最后的一个 `.` ,如果selinux开机自启,那么创建的文件都会有此后缀,想消除需要彻底关闭selinux(/etc/selinux/config)
字母 | 含义 | 对应八进制(octal)权限 |
---|---|---|
r(read) | 读取权限 | 100(4) |
w(write) | 写入权限 | 010(2) |
x(execute) | 执行权限 | 001(1) |
-(没有权限) | 没有权限 | 000(0) |
修改基本权限
基本权限是针对属主、属组、其他用户修改的,修改方式如下。
# ugo方式
chmod //修改文件目录权限rwx -R 递归修改
[root@wqh06 ~]# touch file
[root@wqh06 ~]# chmod a=rwx file
[root@wqh06 ~]# chmod a+rwx file
[root@wqh06 ~]# ll file
-rwxrwxrwx 1 root root 0 Mar 20 21:19 file
[root@wqh06 ~]# chmod a=-rwx file
[root@wqh06 ~]# chmod a-rwx file
[root@wqh06 ~]# ll file
---------- 1 root root 0 Mar 20 21:19 file
[root@wqh06 ~]# chmod u+rw,g+r,o+rx file
[root@wqh06 ~]# ll file
-rwxrwxrwx 1 root root 0 Mar 20 21:19 file
[root@wqh06 ~]# chmod u=rwx,g=rw,o=rx file
[root@wqh06 ~]# ll file
-rwxrw-r-x 1 root root 0 Mar 20 21:19 file
# number方式
mkdir dir //建立目录
touch dir/file //建立文件
# 用八进制数赋予权限
chmod 777 dir/ //修改dir目录权限为777
chmod u+rwx,g+rwx,o+rwx
chmod 666 dir/file //修改file文件权限为666
chmod u+rw,g+rw,o+rw
# -R递归
chmod -R 766 dir/ //修改目录及子目录权限
rwx权限对文件的影响
r:文件可以读取内容,不能写,不能执行,可以cat,less
w:文件可以写入内容,但是追加只能>>,不能vim,因为不能读取内容,所以不能修改文件内容,只能覆盖
x:啥也不能干,因为没有读权限。所以无法执行文件中的内容(代码逻辑)
rw:可读,可写,不能执行
rx:可读,可执行,不能写
rwx:可读,可写,可执行
注意:文件的rwx权限,只能针对文件内容,如果想要删除,或者移动,那么跟文件所在目录的权限有关
# 可以把目录想成一个文件,不过这个文件存放的是目录内的文件元数据
rwx权限对目录的影响
r:可以查看目录下所有的文件名,但是看不见文件的详细信息(元数据)
rx:加上x权限,就可以看见文件的详细信息(元数据) # 目录权限中最常见的
wx:可以创建,可以删除,不能查看
rw:可以查看目录下的文件,但是不能删除,不能移动,不能拷贝(和单独的r是一个效果)
rwx:删除文件,创建文件,移动文件,拷贝文件,查看
w:啥也不是,无法添加文件,无法删除文件(因为少了x)
x:啥也不是(但若知道目录下的一个具体文件名,可以cat文件内容)
修改属主和属组
基本权限的设定,主要是针对属主和属组,然后是其他用户。对于一个文件或者目录拥有什么权限,
取决于你是谁(是这个文件/目录的属主、属组还是其他用户)。
属主属组修改命令chown
chown # 更改属主以及属组 -R:递归修改
# 修改属主
chown user01 dir/ # 修改所属主为user01
ll -d dir/ # 检查属主
drwxr-xr-x 2 user01 root 4096 MAR 31 00:50 dir/
# 修改属组
chown .adm dir/ # 方法一:修改所属组为adm
chgrp adm dir/ # 方法二:修改所属组为adm
ll -d dir/ # 检查属组
drwxr-xr-x 2 bin adm 4096 MAR 31 00:50 dir/
# 修改属主和属组(一起修改)
chown root.root dir/ # 只修改此目录属主和属组为root
chown -R root.root dir/ # 递归修改目录及目录下的所有文件属主和属组为root
# 对于 -R 递归这个选项,chmod 有,chown 有,chgrp 也有,大家都有,才是真的有
特殊权限
SUID
引入一个例子,当我们在普通用户登录Linux系统的情况下修改自己的密码时,系统命令passwd做了什么?经过了什么流程?
我们知道所有用户信息、密码信息都保存在/etc/passwd
和/etc/shadow
文件中,也就是普通用户使用passwd命令
变更自身密码时,
要修改/etc/passwd
和/etc/shadow
文件。
然而对于普通用户而言,我们是没有权限修改这两个文件的(属于其他用户,观察其他用户权限位):
那我们是怎么修改了自身的密码?并将信息更新到上面的两个文件中的呢?
我们再看看我们使用的
passwd命令
,找到原因:
观察这个文件的属主权限位!居然有一个
s
!
这就是特殊权限之一的s(SetUID)
,顾名思义,它出现在属主权限位, 一般对应的是可执行文件。
如果一个可执行文件在属主权限位上的x位有s(SetUID)权限
,那么任何用户(root不受影响)执行这个文件时,都会以该文件的属主的身份去执行。
# SUID授权
# chmod ugo方式
[root@wqh06 ~]# chmod u+s 文件或目录
# chmod number方式 4000
[root@wqh06 ~]# chmod 4755 abc
[root@wqh06 ~]# chmod 4000 abc
注意:当授权文件,原本属主位上有x权限时,是小写s,原本属主位上没有x权限时,是大写S
SGID
将目录权限位设置成SGID后,在其目录下继续创建文件时,其所属组(只有所属组)与该目录保持一致。
使用sgid可以使得多个用户之间共享一个目录的所有文件变得简单。主要目的即共享目录
。
# SGID授权
# chmod ugo方式
[root@wqh06 ~]# chmod g+s /tmp/test/
# chmod number方式 2000
[root@wqh06 ~]# chmod 2755 /tmp/test/
注意:当授权目录,原本属组位上有x权限时,是s,原本属组位上没有x权限时,是S
SBIT(Sticky Bit)
SBIT(Sticky Bit)
翻译为粘滞位
,目前只对目录有效。上面的SUID/SGID都是针对属主权限位、属组权限位的。
SBIT可想而知,是针对与其他用户权限位设置的。其他用户权限位的x
位,变成了t
,就是粘滞位。
设置粘滞位的目的是什么?
一句话,为了各个普通用户在此目录下,可以随意创建、修改、删除属于自己的文件,但不能够删除其他用户的文件。
一个目录其他用户权限位最常见的属性是
r-x
,如果我们想让其他用户(或者所有用户)都可以在这个目录下随意创建、修改、删除自己的文件(公共站点),
那么就需要将它的权限位设置成rwx
,此时会出现一个问题,如果是rwx
,那么任意一个普通用户都可以修改和删除其他人在这个目录(公共站点)的文件。
加了t
后,除了root以外,其他每个普通用户只能在这个目录下创建、修改、删除自己的文件,不能删除
其他用户(只针对用户,不针对组)的文件。
注意:如果在/tmp目录下,普通用户user01
的文件,其他用户权限位是rwx
,那么换一个普通用户user02
还是可以任意修改的。
# SBIT授权
# chmod ugo方式
[root@wqh06 ~]# chmod o+t /opt
# chmod number方式 2000
[root@wqh06 ~]# chmod 1755 /opt
注意:当授权目录,原本其他用户权限位上有x权限时,是t,原本其他用户权限位上没有x权限时,是T
权限掩码umask
我们在创建一个文件/目录时,没有指定过它们的具体权限位,那系统是怎么分配权限位的呢?
由此引出权限掩码umask,在root用户下查看umask值为0022。
一般情况下,目录用0777减去它,文件用0666减去它,就能得到默认的目录/文件权限。
二般情况下,umask的值不是0022,是0023呢?
目录用0777减去它,权限位:0754
文件用0666减去它,权限位理应是0643,但文件的八进制权限位(后三位)不能有奇数,有奇数要+1,所以是0644
# umask为0022时
[root@wqh06 ~]# umask
0022
mkdir dir // 目录权限的计算
0777
0022
----
0755
touch file // 文件权限的计算
0666
0022
----
0644
# umask为0033时
[root@wqh06 ~]# umask 0033
mkdir dir // 目录权限的计算
0777
0033
----
0744
touch file // 文件权限的计算
0666
0033
----
0644
# umask为0045时
[root@wqh06 ~]# umask 0045
mkdir dir // 目录权限的计算
0777
0045
----
0732
mkdir dir // 文件权限的计算
0666
0045
----
0622
# umask计算,当umask中出现奇数时:目录计算方式不变,但是奇数位的结果要+1
权限掩码umask的设置
实际上,umask的默认值并不一直是0022,这个umask的值是从/etc/profile中设置加载的。
如图所示,如果用户UID大于199,并且用户名
和组名
相同,那么权限掩码是0002
,否则是0022
。
验证: