目录
一、权限的概念
二、权限管理
2.1 文件访问者的分类(人)
2.2 文件类型和访问权限(事物属性)编辑
2.2.1 文件类型
extra file 指令
2.2.2 访问权限
extra chmod 指令
2.3 文件权限值的表示方法
2.4 修改文件的所有者和所属组
2.4.1 修改文件的所有者
2.4.2 修改文件的所属组
2.5 默认权限与权限掩码
2.6 目录的权限
2.6.1 目录的权限的作用
2.6.2 粘滞位
Linux下有两种用户:超级用户(root)、普通用户。
超级用户:可以再linux系统下做任何事情,不受限制 普通用户:在linux下做有限的事情 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”
命令:su [用户名]
功能:切换用户
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的密码
说明:有人可能会觉得,既然我们已经知道了root账号的密码,为什么还要使用普通用户呢?由于root账号的权限很高,一些误操作可能造成很大的影响,为了减少失误造成的影响,我们一般使用普通用户,但是普通用户的权限有时候受阻不能进行一些操作,这时候就需要我们暂时性的切换到root账号进行操作了。如果我们只想使用root账号执行一条指令,可以使用sudo进行提权
权限是依赖于文件的!
一件事情能否允许被你做,取决于——人(角色)、事物属性
2.1 文件访问者的分类(人)
文件和文件目录的所有者:u -- User
文件和文件目录的所有者所属组的用户:g -- Group说明:一个组内可以只有一个人,并以组长的名字对组命名。我们的工作通常以小组的方式进行,所属组可以隔离不同小组的用户。
其它用户:o -- Others2.2 文件类型和访问权限(事物属性)
说明:
为什么只列出了文件的 所有者和所属组呢,因为其它用户是无法穷举的^O^
Windows依靠后缀.区分文件类型,但是Linux中文件类型与后缀无关。为什么我们创建文件名还要带上后缀呢,Linux上可能有些软件是依靠后缀区分文件类型的,而且带上后缀可以帮助程序员分辨文件类型呀^O^
2.2.1 文件类型
Linux文件类型的分类——使用文件属性第一位的一个字符来区分文件类型
- 普通文件、源代码、可执行程序、库 d 目录文件(directory c 字符设备文件(char)键盘、显示器 b 块设备文件(block l 链接文件(link p 管道文件(pipeline
字符设备文件 "c"
块设备文件 "b"
链接文件 "l"
管道文件 "p"
extra file 指令
file指令 用于辨识文件类型
file test.txt file dir file /dev/tty file /dev/vda file /usr/lib64/libz.so.1
演示效果:
2.2.2 访问权限
使用ll指令(小写的LL,即ls -l)查看文件的属性
基本权限
1. 读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
2. 写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
3. 执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
4. “-”表示不具有该项权限extra chmod 指令
chmod指令 用于修改文件的权限
chmod u+r test.txt # 给test.txt文件的拥有者加上可读权限 chmod u-w test.txt # 给test.txt文件的拥有者减去可写权限 chmod u+x,g-r test.txt # 给test.txt文件的拥有者加上可执行权限、所属组减去可读权限 chmod o+rwx test.txt # 给test.txt文件的其它用户加上所有权限 chmod a-r test.txt # 给test.txt文件的所有访问者减去可读权限 我们可以使用 cat test.txt 指令来检测当前访问者是否拥有该文件的读权限 我们可以使用 echo "hello" >> test.txt 指令来检测当前访问者是否拥有该文件的写权限
演示效果:
注意:root可以修改任何文件的权限;一般用户且非该文件的所有者、所属组,不能修改该文件的权限;没有对应的权限无法进行相应的操作,输入的指令会被操作系统拦截
2.3 文件权限值的表示方法
如此一来,我们就可以用字符 '0' 或 '1' 来表示该位置上是否有对应的权限,例如:'---' : '000' 对应的八进制数据 0 '--x' : '001' 对应的八进制数据 1 '-w-' : '010' 对应的八进制数据 2 '-wx' : '011' 对应的八进制数据 3 'r--' : '100' 对应的八进制数据 4 'r-x' : '101' 对应的八进制数据 5 'rw-' : '110' 对应的八进制数据 6 'rwx' : '111' 对应的八进制数据 7
演示效果:
2.4 修改文件的所有者和所属组
2.4.1 修改文件的所有者
在日常生活中,我们把东西交给别人,是否需要得到别人的同意呢?同样的道理,我们把文件的所有者修改为别人的时候,理所应当也应该得到他的同意,但是怎样得到他的同意呢?处理起来貌似相当的麻烦,比起考虑怎样得到别人的同意,不如直接硬塞给他,由别人自己来处理文件。
如果出现图中无法使用sudo指令的情况,可以进入root账号,打开配置文件/etc/sudoers, 找到 root ALL = (ALL) ALL,在下面添加一行 username ALL = (ALL) ALL
2.4.2 修改文件的所属组
2.5 默认权限与权限掩码
我们新建几个文件/目录,发现这些文件/目录它们创建后的权限都是一样的,实际上我们创建的文件/目录的 默认权限 = 起始权限 去掉 对应位置上权限掩码和起始权限都有的权限,使用 umask 指令查看当前的权限掩码(Linux下默认的权限掩码为0002,其中后三位八进制数字002就是我们权限掩码表示的权限),我们可以使用 umask + [四位数字] 修改当前的权限掩码,验证一下上述说法。如果把权限掩码修改为 0000,再次新建一个文件/目录,查看文件属性就能看到一个新建文件/目录的起始权限了(文件的起始权限为666,目录的起始权限为777)。
我们再结合图文分析一下上图中文件/目录的默认权限是怎样得到的 文件的起始权限为666 (110-110-110) [rw-rw-rw-] 权限掩码0002->002 (000-000-010) [-------w-] 文件的默认权限为664 (110-110-100) [rw-rw-r--] 目录的起始权限为777 (111-111-111) [rwxrwxrwx] 权限掩码0002->002 (000-000-010) [-------w-] 目录的默认权限为775 (111-111-101) [rwxrwxr-x]
注意:不要误认为 默认权限 = 起始权限 - 权限掩码
最终权限 = 起始权限 & (umask) 起始权限为666 (110-110-110) [rw-rw-rw-] 权限掩码为003 (000-000-011) [-------wx] 各位取反后775 (111-111-100) [rwxrwxr--] 默认权限为664 (110-110-100) [rw-rw-r--] 起始权限为777 (111-111-111) [rwxrwxrwx] 权限掩码为002 (000-000-010) [-------w-] 各位取反后775 (111-111-101) [rwxrwxr-x] 默认权限为775 (111-111-101) [rwxrwxr-x] 因为目录的起始权限为777(全1),所有目录文件的默认权限刚好就是"起始权限 - 权限掩码"
权限掩码的存在是为了满足用户多样化的需求,不同用户可能对一个新建的文件的权限有不同的需求,用户根据需要设置权限掩码可以简化操作(无需再重复通过指令来修改文件的权限)
2.6 目录的权限
2.6.1 目录的权限的作用
可执行权限:
如果访问者没有该目录可执行权限,则无法cd到该目录中
可读权限:如果访问者没有该目录可读权限,则无法用ls等命令查看该目录中的文件内容以及文件属性(也就是说,一个文件的属性是否能被访问者查看,是由这个文件所在的目录的权限决定的)
可写权限:如果访问者没有该目录可写权限,则无法在该目录中创建/删除文件(也就是说,一个文件是否能被访问者删除,是由这个文件所在的目录的权限决定的,与该文件本身无关)
于是,问题来了。如果访问者拥有目录的写权限,他就可以删除目录中的文件(无论他是否拥有这个文件的写权限)。这样好像有些违背常理,张三创建的一个文件,凭什么可以被你李四直接删掉? 但是我们要考虑到为什么一个目录的起始权限是"777",如果我们不能进入这个目录,不能查看这个目录中的文件的属性,不能在这个目录中创建文件、删除文件,那我们还创建这个目录干什么呢?Linux系统下的默认权限掩码是"0002"就是为了去掉others的写权限防止上述问题的发生。除此之外,一般情况下,不同的账号是在各自的home目录下独立工作的,而且新建用户的home目录对other是没有写权限的,不会发生上述问题。
但是,有时候可能需要多个账号在同一目录下(当然这个目录不能是在任何一个用户的home目录下,root就提供了相应的目录)协同工作,共享一些数据,仍然无法避免上述问题。为了解决这个不科学的问题,Linux又引入了粘滞位的概念
2.6.2 粘滞位
"chmod +t"(注意空格的分布)可以为一个目录添加粘滞位(修改的是other的权限),