同样,用户对文件的权限分为了读、写、执行三种,其中文件和文件夹对于这三种理解不同,重点的是所谓权限,其实是对内容操作的权限,而不是文件自身。
文件夹嵌套的情况下,权限如何发挥作用?
1. 用户和文件有什么关系
1.1 用户和文件之间的关系
张三创建了某个文件,如 touch 111.txt,那么张三就是这个文件的所有者,对这个文件来说,马云就是其他人。
用ll命令列出某目录下的文件如下
-rw-r--r-- 1 root root 0 Aug 17 10:19 111.txt -rw-r--r-- 1 root root 0 Aug 17 10:19 222.txt drwxr-xr-x 2 root root 4096 Aug 17 10:19 test
可见,root是文件111.txt和222.txt的所有者,对它的权限rw-就是读写权限。如果是马云,那就是r--,就是只读,不能写和执行。
1.2.读、写、执行对文件和文件夹分别意味着什么?
初学的时候,望文生义,很容易搞不清楚读、写、执行是对什么起作用。
比如,文件夹test里面有文件111.txt,在文件夹test上权限给满,111.txt设置为只读,那普通用户还能删掉这个文件吗?
一实验,发现可以删掉,怎么111.txt设置为只读文件,普通用户也可以删掉它?一头雾水。
首先要清楚的是,用户root是超级管理员,不受这些限制。
其次要理解,这些权限是对其内容而言的设置。
用户马云,在111.txt身上算是其他人,如果没有读权限,则打不开111.txt,就是cat 111.txt会出现权限拒绝。如果没有写权限,则不能编辑111.txt(但是用vi有点问题,系统bug,111.txt有内容,马云没权限写,结果一样可以打开,但是打开的是无内容的显示,然后马云可以键入新的文本,强制保存,原来111.txt内容会被覆盖了),如果没有执行权限,则不能执行。
用户马云,在文件夹test上算是其他人,如果没有读权限,则用ls列出目录中有哪些文件时会被禁止,没有写权限,则不能在文件夹中创建和删除文件,只能改一改现有的文件,没有执行权限,则不能进入该目录。
111.txt算是文件夹test的内容,可以删掉是因为文件夹test的权限给满了,而不看111.txt自身的权限。111.txt自身的权限设置,管理的是它里面的内容的权限。
文件 | 文件夹 | |||
r | 4 | 读 | 查看文件内容 cat/more/head/tail/less |
列出目录中的内容 ls/ |
w | 2 | 写 | 修改文件内容 vim |
在目录中创建、删除文件 touch/mkdir/rmdir/rm |
x | 1 | 执行 | 执行文件 (脚本或命令) |
可以进入目录 cd |
父目录权限和子目录权限的影响是怎么样的?
假设某文件夹路径是这样的:
/ study / english / 111.txt
用户马云对于这些文件都是其他人的身份。
问,当文件夹 study 对马云的权限只读,文件夹 english 对马云的权限是读写执行,文件 111.txt 对马云的权限是读写执行,那么马云可以查看111.txt的内容吗?
答:不可以,权限要从最外层的文件夹开始进入,因为study不具备执行权限,进入不了,虽然english和111.txt有权限,也查看不了。
如果把study改为只有执行权限,没有读权限呢?
可以看到,进入study可以,列出study下内容就不行
但是查看文件夹english和文件111.txt都是正常的。
在文件夹study下新建文件不行,但是在english下新建文件可以。
也就是说,文件夹的权限并不具有继承性,当我在文件夹english下新建文件时,没有因为父级文件夹没有权限而不能操作。
父级文件夹只要有x权限,那么子级文件夹就不受父级文件夹的影响了。父级文件夹没有x权限,其下的文件和文件夹在操作时会受到影响。
有点类似大院子嵌套小院子,大院子没有x权限(没有钥匙),就进入不了大院子,那你们的小院子,你有钥匙也没有用。
这时study没有了执行权限,进不了study目录,则执行新建文件如下:
可以看出,没有执行权限的文件夹,其下的文件夹和文件在操作时受到了影响。
1.3.怎么更改文件和文件夹的权限
1.首先要问哪些用户能更改文件权限?
答:超级管理员和文件所有者可以修改,其他人修改不了。
2.怎么修改?
答:
命令名称:chmod
命令英文原意:change the permissions mode of a file
命令所在路径:/bin/chmod
执行权限:所有用户
选项:-R递归修改
功能描述:改变文件或目录权限
方法1 | 方法2 |
chmod [{ugoa}{+-=}{rwx}][文件或目录] | chmod [mode=421][文件或目录] |
这种方法是直接修改文件的某些用户的权限位,不用管其他用户的情况。 u代表所有者、g代表所属组,o代表其他人,a代表全部。 |
读权限是4 写权限是2 执行权限是1 其实就是二进制位置不同。 rwx,r是二进制100,w是二进制10,x是二进制1。 |
chmod u+x English.zip 把文件English.zip的所有者权限中加上执行权限。 chmod g+r,o-r English.zip chmod g=rx English.zip 不管文件所属组以前是什么权限,现在就是设置为rx |
chmod 755 English.zip 7就是111,就是rwx都有了,同样,5就是读和执行的权限,这句话就是设置文件English.zip所有者是读写执行权限,所属组和其他人是读和执行的权限。 |
选项:-R递归修改 新建文件夹时,-p是递归依次创建,而修改文件或文件夹权限时,如果要修改目录下的子目录和文件权限同时修改,要用-R chmod -R 777 /tmp/a/ 把/tmp/a/及其所有子目录和文件的权限都改为777 |
1.4.怎么更改文件的所有者和所属组,chown和chgrp
命令名称:chown
命令英文原意:change file ownership
命令所在路径:/bin/chown
执行权限:root
语法:chown 【选项】【新主人的用户名】【文件或目录】
功能描述:改变文件或目录的所有者,选项 -R 可以递归修改文件夹下所有子目录和文件
范例:$ chown mayun 111.txt (把文件111.txt的所有者改为mayun)
首先,改变文件的读写执行权限的时候,root和文件所有者都可以操作。但是改变文件所有者的时候,只有root可以操作,如下图。
当然,把文件换新主人,那新主人的用户名不能输入错。
改变文件所有者后,所属组还是root哦!
那怎么改变所属组呢?和改变文件所有者类似,只是把chown换成chgrp
命令名称:chgrp
命令英文原意:change file group ownership
命令所在路径:/bin/chgrp
执行权限:所有用户
语法:chgrp【新的用户组】【文件或目录】
功能描述:改变文件或目录的所属组
范例:$ chgrp mayun 111.txt 改变文件111.txt的所属组为mayun
现在又有个问题,没设置之前文件的所有者和所属组是谁?
答:文件的所有者很简单,谁创建了这个文件,文件的所有者就是谁!
那文件的所属组是谁?就是文件所有者的主要组。
1.5.新建的文件夹和文件默认什么权限?(不常用)
我们新建一个文件222.txt,新建一个文件夹dir2,看看系统给他们的默认权限是什么?
从哪里知道新建文件夹的权限是rwxr-xr-x呢?
答曰:umask命令就是干这事的,它就是查看新建文件夹和新建文件的默认权限。
看到了文件夹默认权限情况,文件的默认权限比文件夹少个x ,防止被攻击。
命令名称:umask
命令英文原意:the user file-creation mask
命令所在路径:Shell内置命令
执行权限:所有用户
语法:umask [-S]
-S 以rwx形式显示新建文件默认权限
功能描述:显示、设置文件的默认权限
范例:$ umask -S
如上图,root和普通用户得到的默认权限还不一样。
用root用户,新建文件夹时默认权限为755,文件权限默认644,能否更改为默认新建文件夹为700,默认新建文件权限600呢?
答曰:可以,与rwxrwxrwx异或算法得出权限码,然后umask 权限码即可。
rwx rwx rwx 为777
与什么异或能得到700 (rwx------)?
得到结果---rwxrwx,也就是077
因此,只要umask 077即可得到想要的结果。
umask 077后,新建的文件夹dir3权限就是rwx------,新建的文件就是去掉可执行权限后的效果。
也就是说,umask的参数和得到的结果都是补码,不是直接的权限码