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