文件的访问者
文件的访问者,可以分为三类
- 拥有者(owner):拥有该文件的访问者
- 所属组(group):该文件所属的组
- 其他人(other):除了拥有者、所属组外的其他访问者
当我们查看更多文件更多属性的时候
会显示拥有者和所属组,而除了这两个以外的就被称为其他人。
为什么会分出拥有者、所属组和其他人呢?
假设你自己独立设计出了一款软件,将用户类别划分为拥有者、所属组和其他人,更方便对访问软件的人做出约束:
只有你自己能操作
允许你和你所在的组操作
允许你和你所在的组以及其他人也能操作。
……
上面所属组的位置只有一个用户,这样也算组吗?当然是可以的呀,一个人作一个组这是被允许的。
文件的类型和权限表达
先来看一下文件的类型
标识 | 档案的类型 |
---|---|
– | 普通文件 |
d | 文件夹(目录) |
l | 软链接 |
b | 块设备文件 |
p | 管道文件 |
c | 字符设备文件 |
s | 套接口文件 |
//例如
//test.c是一个普通文件,拥有者为root用户,所属组为root用户
-rw-r--r-- 1 root root 79 Jan 22 15:00 test.c
//test_commands是一个文件夹,拥有者为YDY,所属组为YDY用户
drwxrwxr-x 4 YDY YDY 4096 Apr 9 20:12 test_commands
如果我们只知道Linux系统上的某文件的文件名,如何查看它是什么类型的文件呢?
使用命令:file
功能:查看文件的类型
格式:file 选项 文件名
//例如
[root@VM-0-2-centos test_user]# ls
user_dirt1
[root@VM-0-2-centos test_user]# file user_dirt1
user_dirt1: sticky directory
[root@VM-0-2-centos test_user]#
用户的一般权限有可读权限、可写权限、可执行权限,三三为一组。
标识 | 代表的权限(对文件) | 代表的权限(对目录) |
---|---|---|
r | 拥有读取文件内容的权限 | 具有浏览该目录信息的权限 |
w | 拥有修改文件内容的权限 | 拥有删除移动目录内文件的权限 |
x | 拥有执行文件的权限 | 具有进入目录的权限 |
– | 没有某一权限 | 没有某一权限 |
例如:
权限符号 | 说明 |
---|---|
r— — | 只读 |
— w — | 仅可写 |
— — x | 仅可执行 |
…… | …… |
例如
//test.c的拥有者对该文件有r、w权限,没有x权限
//test.c所属组对该文件有r权限、没有w、x权限
//其他人对该文件有r权限、没有w权限、没有x权限
-rw-r--r-- 1 root root 79 Jan 22 15:00 test.c
权限只有《有、无》两种结果,所以可使用2进制,1代表有某一权限,0代表没有,Linux对于权限的表达方法可以用十进制的数字
权限符号 | 说明 | 二进制 | 十进制 |
---|---|---|---|
r— — | 只读 | 100 | 4 |
— w — | 仅可写 | 010 | 2 |
— — x | 仅可执行 | 001 | 1 |
…… | …… | …… | …… |
要注意三个三个为一组。现在可能对这种表达的方式不能理解,修改权限的时候就可以理解了。
文件权限的修改
可以对文件的权限进行修改。
命令:chmod
功能:实际上是change mode 的缩写,功能是可以修改权限
格式:chmod 选项 更改权限 文件名。
说明:选项可写可不写,若有需要,可自行查阅man-pages
使用chmod有两种方式。
【方式一】
chmod 用户表示符+/-权限标识符 文件名
用户表示符有:
u
:代表拥有者g
:代表所属组o
: 其他用户a
:所有用户
加权限使用+
,减权限使用-
。
//例如
[YDY@VM-0-2-centos ~]$ ls -l -d ls_test
-rw-rw-r-- 1 YDY YDY 0 Apr 7 16:35 ls_test
[YDY@VM-0-2-centos ~]$ chmod u+x ls_test //给拥有者增加x权限
[YDY@VM-0-2-centos ~]$ ls -l -d ls_test
-rwxrw-r-- 1 YDY YDY 0 Apr 7 16:35 ls_test
[YDY@VM-0-2-centos ~]$ chmod g-w ls_test //给所属组减去w权限
[YDY@VM-0-2-centos ~]$ ls -l -d ls_test
-rwxr--r-- 1 YDY YDY 0 Apr 7 16:35 ls_test
[YDY@VM-0-2-centos ~]$ chmod o+wx ls_test //给其他人加上w和x权限
[YDY@VM-0-2-centos ~]$ ls -l -a ls_test
-rwxr--rwx 1 YDY YDY 0 Apr 7 16:35 ls_test
[YDY@VM-0-2-centos ~]$
【方式二】
chmod 数字权限表示符 文件名
不需要使用用户表示符,直接使用数字权限表示符来修改
例如:
文件拥有者、所属组的修改
文件拥有者修改
命令:chown
格式:chown 用户 文件名
功能:修改文件的拥有者
//例如
[root@VM-0-2-centos ~]# ll
total 16
-rw-r--r-- 1 root root 79 Jan 22 15:00 test.c //文件的拥有者为root用户
[root@VM-0-2-centos ~]# chown YDY test.c //将文件的拥有者改为YDY的普通用户
[root@VM-0-2-centos ~]# ll
total 16
-rw-r--r-- 1 YDY root 79 Jan 22 15:00 test.c //文件拥有者变为YDY的普通用户
实际上,只有root用户可以这样直接更改拥有者,因为root用户的权限最高。
这就好比,我把东西给你,你选择可以要,也可以选择不要,而root用户就相当于是老大,你不要也得要。
所以使用普通用户的来直接更改文件的拥有者是不行的
//例如
-rwxrwxrwx 1 YDY YDY 0 Apr 10 15:26 test_chmod //本来拥有者为YDY用户
[YDY@VM-0-2-centos test_commands2]$ chown root test_chmod
chown: changing ownership of ‘test_chmod’: Operation not permitted //提示,操作不被允许
那么普通用户如何更改文件的拥有者?
答案是:暂时赋予最高权限,相当于暂时给了你这个普通用户,root的能力。可使用sudo
命令,前提是这个普通用户已经被root用户信任。
还可以使用chown
同时修改拥有者和所属组
格式为:chown 拥有者用户:所属组用户 文件名
[root@VM-0-2-centos ~]# ll
total 16
-rw-r--r-- 1 root root 79 Jan 22 15:00 test.c
[root@VM-0-2-centos ~]# chown YDY:YDY test.c //同时修改拥有者和所属组
[root@VM-0-2-centos ~]# ll
total 16
-rw-r--r-- 1 YDY YDY 79 Jan 22 15:00 test.c//修改成功
文件所属组修改
命令:chgrp
格式:chgrp 用户名 文件名
功能:修改文件的所属组
//例如
[root@VM-0-2-centos YDY]# ll
total 16
-rw-r--r-- 1 root root 0 Apr 10 16:01 test_chgrp //本来所属组为root用户
[root@VM-0-2-centos YDY]# chgrp YDY test_chgrp //将文件的所属组修改为YDY普通用户
[root@VM-0-2-centos YDY]# ll
total 16
-rw-r--r-- 1 root YDY 0 Apr 10 16:01 test_chgrp //修改成功
和修改文件的拥有者差不多,直接修改所属组也只有root用户可以,否则要暂时使得普通用户获得最高权限。
关于权限掩码
不知道你有没有发现,当你创建文件的时候,所有文件的权限都是一样的。
//我的linux系统上
[YDY@VM-0-2-centos test_commands2]$ touch test_file1 test_file2 test_file3
[YDY@VM-0-2-centos test_commands2]$ ll
total 0
-rw-rw-r-- 1 YDY YDY 0 Apr 10 16:15 test_file1
-rw-rw-r-- 1 YDY YDY 0 Apr 10 16:15 test_file2
-rw-rw-r-- 1 YDY YDY 0 Apr 10 16:15 test_file3
为什么权限我的linux系统上的文件的权限默认都是rw-rw-r--
?
而当我新建目录文件的时候,默认权限都是rwxrwxr-x
.
[YDY@VM-0-2-centos test_commands2]$ mkdir test_dirt1 test_dirt2 test_dirt3
[YDY@VM-0-2-centos test_commands2]$ ll
total 12
drwxrwxr-x 2 YDY YDY 4096 Apr 10 16:21 test_dirt1
drwxrwxr-x 2 YDY YDY 4096 Apr 10 16:21 test_dirt2
drwxrwxr-x 2 YDY YDY 4096 Apr 10 16:21 test_dirt3
-rw-rw-r-- 1 YDY YDY 0 Apr 10 16:15 test_file1
-rw-rw-r-- 1 YDY YDY 0 Apr 10 16:15 test_file2
-rw-rw-r-- 1 YDY YDY 0 Apr 10 16:15 test_file3
事实上:
也就是:
- 普通文件的默认起始权限是:
rw-rw-rw-
- 目录文件的默认起始权限:
rwxrwxrwx
但是我的Linux系统上,却不一样?
这要涉及到权限掩码,可以使用umask命令查看你的系统的权限掩码
记住一个公式:
这个公式的意思是,把mask按位取反,然后和相应的默认起始权限按位与,最后得到相应的默认权限。
以我的linux系统为例。
我的linux的权限掩码为0002,取后三个,也就是002,002对应二进制000 000 010.取反后和666默认起始权限,也就是110 110 110按位与,最后得到664,也就是
rw-rw-r
.
关于目录的权限
目录的权限限制了什么呢?
- 可读权限: 如果用户对于目录没有可读权限, 则该用户无法用ls等命令查看目录中的文件内容.
- 可写权限: 如果用户对于目录没有可写权限, 则该用户无法在目录中创建文件, 也无法在目录中删除文件.
- 可执行权限:如果目录没有可执行权限,则该用户无法使用
cd
命令切换到该目录中
那么按照逻辑来说,只要我这个用户拥有了可写的权限,是不是就可以不受限制地在该目录下新建和删除文件了呢?
[test_user@VM-0-2-centos ~]$ ll
total 4
drwxrwxrwx 2 test_user test_user 4096 Apr 10 19:43 user_dirt1 //目录
[test_user@VM-0-2-centos test_user]# cd user_dirt1 //切换到该目录
[test_user@VM-0-2-centos user_dirt1]$ ll
total 0
-rw-rw-r-- 1 YDY YDY 0 Apr 10 19:28 user_file1 //目录下的文件拥有者和所属组为YDY
[test_user@VM-0-2-centos user_dirt1]$ rm -rf user_file1 //尝试删除
[test_user@VM-0-2-centos user_dirt1]$ ll
total 0 //居然删除成功了!
为什么我YDY是拥有者和所属组,却可以被你test_user用户给删了呢?这样真的不太地道。
为了解决这个不地道的事情, Linux引入了粘滞位的概念
【粘滞位】
使用粘滞位可以满足other在特定的目录下创建文件并且写入,但是只有文件的拥有者才能删除该目录下的文件。
如何设置为目录设置粘滞位?
答:为目录的other添加t
权限 ,就设置了粘滞位,可使用命令chmod o+t 目录名
此时该目录下的文件就不允许其他人随便删除了