文章目录
1.Shell命令以及运行原理
2.Linux权限的概念
2.1用户介绍
2.2用户切换指令 su
当前所处目录不变
当前所处目录改变
3.Linux 权限管理
3.1文件访问者的分类
3.1.1 拥有者
3.1.2 所属组
3.1.3 other
3.1.4 总结
3.2文件类型和访问权限
3.2.1文件类型
3.2.2 基本权限
3.3文件权限值的表示方法
3.3.1字符表示法
3.3.2数字表示法
3.3.3总结
3.4文件访问权限的相关设置方法
chmod指令
chown指令
chgrp指令
umask 文件掩码
3.5目录的权限
概念
粘滞位
4.总结
1.Shell命令以及运行原理
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel) “ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如下图,蓝色箭头表示用户通过Shell与Linux Kernel 沟通,绿色箭头表示 Linux Kernel 通过Shell 返回给用户一些信息。
对比windows GUI(图形用户界面),我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符,在Linux下就相当于cd指令)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
那么shell存在的意义是什么呢?一方面,是为了帮忙进行命令行传递和返回结果,另一方面是保护操作系统。此外,shell在执行命令的时候,会创建子进程来执行。
2.Linux权限的概念
2.1用户介绍
首先要清楚 Linux 下有两种用户:超级用户(root)、普通用户。(类似于 Windows 下的 管理员用户和普通用户。)
超级用户(root):可以在linux系统下做任何事情,不受限制。
普通用户:在linux下做有限的事情。
超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
可以根据下图来看,上层的红色方框是 root ,一来根据 [ ] 最左边看出,而来也可以根据命令提示符 “#” 看出;下层红色方框的用户是 leo ,是一个普通用户,使用 su leo ,保持当前目录不变,用户换成leo,由于当前目录是属于 root 的,leo没有权限查看,所以用ls、ll 都会提示无权限,只有使用 cd ~ 进入leo自己的家目录,才可以操作。(后面会解释为什么leo没有权限,以及su leo,)
2.2用户切换指令 su
如上图,有时候我们会涉及到切换用户的场景,此时就需要使用 su 指令。
命令: su [用户名]
功能:切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root 用户的口令。
当前所处目录不变
使用 su [用户名] 就可以实现当前目录不变,用户改变。比如下方,一开始的用户是root,并且处于root 的家目录,然后使用 su leo 指令,切换为 leo 用户,可以看出,当前所处的目录名是 root ,这是 root 用户的目录,使用 ls 指令,提示无权限查看。
同样的,我现在是leo用户,直接输入 su 并回车,提示Password: ,这时输入root的密码即可,切换为root用户,可以发现目录是root的家目录,使用ls指令查看当前目录的内容,确实如此。
当前所处目录改变
使用 su - [用户名] 可以实现:将目录改为 更换后的用户的家目录 ,并且用户改变。比如下方,一开始是root 用户,且所处目录是root 的家目录,然后使用 su - leo 切换为leo 用户,切换之后可以看到,目录也换为leo用户的家目录。
然后使用 su - 切换成超级用户,看到,所处目录也自动切换成了root 的家目录。
3.Linux 权限管理
3.1文件访问者的分类
文件访问者,是对于文件而言,谁来访问,具体可以分为 拥有者、所属组、其他:
文件和文件目录的拥有者: u---User
文件和文件目录的所有者所在的组的用户: g---Group
其它用户: o---Others
3.1.1 拥有者
顾名思义,就是文件的拥有者,所有者可以对文件进行任何操作,毕竟属于 “我” 的,“我” 想要删除就删除,想要修改就修改,随便我怎么操作。
3.1.2 所属组
比如一个团队A,协作开发一个项目,团队老大 小a 建立了一个目录(即 小a 是这个目录的拥有者),里面包含项目的所有内容,那么,这个目录总不可能只有 小a 可以访问吧?毕竟每一个组员都要负责自己的那一部分。但是,如果 小a 把这个目录的权限打开,让其他人可以访问、修改,固然达到了组员可以进行操作的目的,但是——如果有另一个团队B,也在开发相同类型的项目,那么,这个团队里面的任何成员,只要找到 小a 建立的那个目录,他们就可以随便访问团队A的项目,这肯定不合适。要达到如下图的要求,只有团队A的成员可以访问该项目。
所以,由于类似的需求,就产生了所属组的概念,一般而言,一个文件的所属组拥有对文件进行操作的权限。当然,所属组是由一个一个用户组成的,比如一个目录的所属组 里面的成员是 zhangsan、lisi、wnagwu,那么这三位用户里的任何一个,都可以对该目录进行的操作,他们三个对这个目录的权限是一样的,而其他人(除了root和这个目录的拥有者)对该目录只有 很有限的权限,或者没有任何权限。
3.1.3 other
一个用户,既不是文件的拥有者,也不是文件所属组里的一员,那么对于这个文件而言,这个用户就是该文件的other,对应的权限一般比较少。
3.1.4 总结
在这里是否会将文件访问者和用户搞混?其实很容易区分,用户就相当于我们生活中的一个一个人,而文件访问者就相当于一个个身份。一个人,在公司是员工,在家里是父亲/母亲,这两个身份不冲突。同样的,对于不同的文件而言,用户也可以是不同的访问者。
如下,使用 ll 查看详细信息时,中间两个内容,第一个是代表该文件的拥有者,第二个内容是代表该文件的所属组。那么other如何判断呢?很简单,当一个用户想要操作某个文件时,这个用户既不是拥有者,也不是所属组,自然就是other了。
3.2文件类型和访问权限
3.2.1文件类型
如下,使用 ll 指令查看当前目录下的内容的详细信息时,每一行的第一个字符,代表的就是该文件的类型。
d:文件夹
-:普通文件
l:软链接(类似Windows的快捷方式)
b:块设备文件(例如硬盘、光驱等)
p:管道文件
c:字符设备文件(例如屏幕等串口设备)
s:套接口文件
值得注意的是,Linux 环境下,文件类型和文件后缀无关。 首先看到 try.c 里面是一个 C 语言的代码。然后用gcc 编译 ,得到 a.out 这个可执行文件。当文件后缀名是 .out ,可以执行。后缀换成 .txt ,依然可以执行。后缀换成 .c 依然可以执行,但是,执行 try.c ,却不可以。充分说明了,文件类型和文件后缀无关。
3.2.2 基本权限
如下,既然文件访问者分为三种类型,那么每一种类型都应该有对应的权限。在每一个文件的详细信息中,除去开头的一个字符,后面九个字符,头三个是拥有者的权限,中间三个是所属组的权限,最后三个是other的权限。(这些符号具体什么意思下文会介绍。)
文件的基本权限可以分为三个:读、写、执行,可以表示为 rwx 。
读(r/4): Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
写(w/2): Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
执行(x/1): execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
“—”表示不具有该项权限
3.3文件权限值的表示方法
3.3.1字符表示法
字符表示法顺序是固定的,第一个位置是读,第二个位置是写,第三个位置是执行,比如:rwx 表示读、写、执行权限均有;-wx表示有写、执行权限,没有读的权限;r-x 表示有读、执行权限,没有写的权限;---表示什么权限都没有。
3.3.2数字表示法
数字表示法是八进制的。上文讲到,三个字符为一组并且位置固定,那么从二进制来看就把它这样子看:对应位置有该权限,就是1,没有则是0。比如:000 表示什么权限都没有;100表示有读的权限,没有其他权限;010表示有写的权限,其他权限没有;101表示有读和执行的权限,其他权限没有。
上面是从二进制来看,细分到每一个权限的。那么把三个权限看作整体,就是八进制,比如 二进制是000,对应八进制0,没有任何权限; 二进制 100,对应八进制4,只有读权限; 二进制 101 ,对应八进制5,有读和执行权限;二进制 011,对应八进制3,有写和执行权限。
3.3.3总结
如下可以很好总结这里的内容:
权限 | 二进制 | 八进制 | 描述 |
---|---|---|---|
--- | 000 | 0 | 没有任何权限 |
--x | 001 | 1 | 只有执行权限 |
-w- | 010 | 2 | 只有写入权限 |
-wx | 011 | 3 | 只有写入和执行权限 |
r-- | 100 | 4 | 只有只读权限 |
r-x | 101 | 5 | 可读可执行权限 |
rw- | 110 | 6 | 可读可写权限 |
rwx | 111 | 7 | 可读可写可执行权限 |
3.4文件访问权限的相关设置方法
chmod指令
chmod
功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名
常用选项:
R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
关于chmod命令的权限值的格式:
① 用户表示符+/-=权限字符
+:向权限范围增加权限代号所表示的权限
-:向权限范围取消权限代号所表示的权限
=:向权限范围赋予权限代号所表示的权限
用户符号:
u:拥有者
g:拥有者同组用
o:其它用户
a:所有用户
②三位8进制数字
如下,三位八进制数字,第一位是拥有者的权限,第二位是所属组的权限,第三位是其他的权限,对着上面的权限和八进制表很容易看懂。
chown指令
该指令是更改文件拥有者。
chown
功能:修改文件的拥有者
格式: chown [参数] 用户名 文件名
如下,当前用户是root,所以可以随意更改任意文件的拥有者。
chgrp指令
不难猜测,该指令是更改文件的所属组。
chgrp
功能:修改文件或目录的所属组
格式: chgrp [参数] 用户组名 文件名
常用选项: -R 递归修改文件或目录的所属组
umask 文件掩码
新建文件夹默认权限=0666,新建目录默认权限=0777。但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask(掩码)的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask & (~umask)。掩码也是八进制的,表示的也是权限,直白地说就是,文件的实际权限,等于默认权限 减去 掩码的权限。
umask
功能:
查看或修改文件掩码修改掩码
格式: umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002
从下面也可以看出,普通用户lijun 新建一个文件夹try,和文件try.c,可以看出其权限发呢别是775和664,和默认权限777、666 相比,w权限都被去掉了。然后使用umask指令查看其掩码,确实是0002.
如何理解 mask & (~umask) 在这里给出个人的一些看法:
3.5目录的权限
概念
可执行权限: 如果目录没有可执行权限, 则无法cd到目录中
可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件
如下,首先查看当前目录下的详细信息。
然后切换成 lijun 用户,对目录 leo 进行操作,从详细信息中可以看出,目录leo 的 other没有任何权限,且其拥有者和所属组都是用户 leo,那么用户 lijun 对于目录 leo 就是其他,所以第二个红色个方框里面的任何操作都没有权限。
但是,对于目录 lijun,其拥有者的权限是rwx,并且其拥有者和所属组都是用户 lijun,当用户lijun对目录 lijun进行操作时,拥有任何权限,如第三个红色方框里面的内容。
从下面可以看出,一开始对于目录 lijun,给other加上可读权限,切换成用户 leo,用户leo对于目录 lijun 是other,所以只能读,不能cd 进入目录 lijun。后来给目录 lijun 的other加上 可执行权限之后,用户 leo才可以cd 进入目录 lijun。
粘滞位
如下图,现在有一个public 目录,其拥有者和所属组是root,other 有 rwx 的权限,假设这个目录是给各个用户来备份一些资料的。
切换成leo用户,该用户对于public来说是other,进入public目录之后,创建一个leo.txt 和 leodic,这是属于leo 用户的目录和文件。并且向leo.txt 里面写入一句话。
切换成lijun用户,可见该用户对于 leo.txt 是other,而leo.txt 的other 只具有读的权限,所以可以读,但是写入内容则没有权限。但是,最重要的来了,我是 lijun 用户,但是我却可以删除 leo.txt 这个属于 leo的文件。这明显不合理,为什么我会可以删除 leo.txt 呢?这是因为,对于public目录,我有写的权限,所以我可以删除public目录里面的内容。但是, leo.txt 是用户leo的,可能记载着他的一些日志或者重要的内容,我怎么可以直接就删掉呢?这不合适,所以对于这样的问题,Linux引入了粘滞位的概念。
粘滞位的作用是:
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
一、超级管理员删除
二、该目录的所有者删除
三、该文件的所有者删除
如下,先给public 这个目录添加粘滞位,然后切换为用户lijun ,进入 public,试图删除用户leo的目录和文件夹,发现不可以。这就是粘滞位。
注意,粘滞位只在other 所具有的权限里面,拥有着和所属组是不具备t 权限的。如下,即使给所有用户加上 t 权限,也只有other 得到了改变。
4.总结
1.如下,使用 ll 指令查看的时候,详细信息解读如图。至于在权限后面的那个数字,对于目录而言,是指它的第一级子目录的个数;对于其他文件而言,表示指向它的链接文件的个数。
2.虽然文件类型和文件后缀无关,但是,这是对于Linux 系统而言。对于Linux 里面的工具,比如 gcc 等,文件后缀和它有关。如下,我把try.c 名字改成 try.txt ,但是里面的内容不变,依然是一个C 语言的代码。但是,此时用gcc 编译,却发现不可以。
3. 权限=人+文件属性。 文件属性=文件类型+文件权限。
关于 Linux 的权限,暂时就写到这里,如有错误,欢迎指正!!