目录
1、shell命令以及运行原理
2、Linux权限
Linux权限的概念
Linux权限管理
文件访问者的分类(人)
文件类型和访问权限(事物属性)
文件权限值的表示方法
文件访问权限的相关设置方法
修改文件的拥有者
修改文件的所属组
查看或修改文件权限掩码
目录的权限
粘滞位
file指令
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel) “ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度, Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
- 将使用者的命令翻译给核心(kernel)处理。
- 同时,将核心的处理结果翻译给使用者。
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。
- 帮助理解:如果说你是一个害羞的程序员,那shell就像媒婆,操作系统内核就是你们村头漂亮的且有让你心动的如花。你看上了如花,但是又不好意思直接表白,那就让你家人找媒婆帮你提亲,所有的事情你都直接跟媒婆沟通,由媒婆转达你的意思给如花,而我们找到媒婆姓王,所以我们叫它王婆,它对应我们常使用的bash。
Linux下有两种用户:超级用户(root)、普通用户。
- 超级用户:可以在linux系统下做任何事情,不受限制
- 普通用户:在linux下做有限的事情。
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$”。
命令: su [用户名]
功能:切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 suroot(root可以省略),此时系统会提示输入root用户的口令。
示例:
添加普通用户:adduser
从root切换普通用户:su user
从普通用户切换root用户:su root 或 su
删除普通用户(一定要是root用户才可删除): userdel -r user
Linux系统中,人分三类:拥有者、所属组、其它用户
- 文件和文件目录的拥有者: u---User(中国平民 法律问题)
- 文件和文件目录的拥有者所在的组的用户(所属组): g---Group(不多说)
- 其它用户: o---Others (外国人)
Linux系统不是以文件名后缀区分文件类型的,而是通过ll指令显示的第一个字符区分文件类型的!
a)文件类型:
d:目录文件 -:普通文件(文本,源代码,可执行程序,第三方动静态库) l:软链接(类似Windows的快捷方式) b:块设备文件(例如硬盘、光驱等) p:管道文件 c:字符设备文件(例如屏幕等串口设备) s:套接口文件
实例:
b)基本权限:
Linux系统中,文件的权限属性分为三类:r(读)、w(写)、x(可执行)
- 读(r): Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息的权限
- 写(w): Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限
- 可执行(x): execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权限
- “—”表示不具有该项权限
前面我们得知第1位是文件类型,后面的9位均为权限属性,如下:
结合先前学到的文件访问者的分类,我们可以对创建的文件进行如下的描述:
- 普通文件file.txt的拥有者具有rw可读可写权限,没有x可执行权限,所属组具有r可读权限,没有wx可写可执行权限,其它用户具有r可读权限,没有wx可写可指向权限。
a)字符表示方法
Linux表示 说明 r-- 只读 -w- 仅可写 --x 仅可执行 rw- 可读可写 -wx 可写、可执行 r-x 可读、可执行 rwx 可读可写可执行 --- 无任何权限 b)8进制数值表示方法
字符表示法中的每一个字符所在位置所表示的结果只有两种可能,要么为真,要么为假,而真可用1表示,假可用0表示,因此我们可以将这三个字符换为三个二进制位,进而换为一个八进制位进行表示。如下:
权限符号 二级制 八进制 r-- 100 4 -w- 010 2 --r 001 1 rw- 110 6 r-x 101 5 -wx 011 3 rwx 111 7 --- 000 0
chmod
功能: 设置文件的访问权限
格式: chmod [参数] 权限 文件名
常用选项:
- R -> 递归修改目录文件的权限
说明:只有文件的拥有者和root才可以改变文件的权限
法一: 用户表示符+/-=权限字符
- +:向权限范围增加权限代号所表示的权限
- -:向权限范围取消权限代号所表示的权限
- =:向权限范围赋予权限代号所表示的权限
- 用户符号:
- u:拥有者
- g:拥有者同组用
- o:其它用户
- a:所有用户
示例:
减去拥有者的读权限:chmod u-r file.txt
减去所属组和其它用户的读权限:chmod g-r,o-r file.txt
加上拥有者所属组其它人的所有权限:chmod u+rwx,g+rwx,o+rwx file.txt
- 注意:root不受任何权限约束,可以为所欲为,现在,我们把普通用户xzy切换到超级用户root:
此时我file.txt的拥有者和所属组均为普通用户xzy,那么我root即其它用户,按照上述权限设置,root作为其它用户不具备任何读写权限,可实际root不受任何约束:
由此可见,这里的其它用户指的是除root以外的其它普通用户。
法二:使用三位八进制数字
此法借用上文8进制数值表示权限的知识,如下:
还使用chmod a= 来进行整体的修改:
chown
功能:修改文件的拥有者
格式:chown [参数] 用户名 文件名
注意:给别人文件需要争得别人同意
实例:
这里并没有经过别人的同意,直接把文件给了root用户,原因就在于使用了sudo提升权限,相等于是以root的身份运行该程序,才有了强制更改的权限。不过这是针对普通用户修改文件权限需要用到sudo,如果是root用户可以直接更改不用sudo。
使用chown可以连续修改拥有者和所属组:
chgrp
功能:修改文件或目录的所属组
格式: chgrp [参数] 用户组名 文件名
常用选项: -R 递归修改文件或目录的所属组
实例:
以root用户直接更改:
以普通身份更改所属组,需要sudo提高权限:
此时拥有者的权限为root,想要改变所属组的可读权限需要sudo提升权限:
umask
功能:查看或修改文件掩码
新建文件夹默认权限=0666,新建目录默认权限=0777
但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是:mask & ~umask。后文会进行详细展开。
这里我们最终创建的目录的权限值为775,最终创建的普通文件的权限值为664(不同系统可能有差异)下文会有解释。
格式: umask 权限值
说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为0022,普通用户默认为0002。
注意:凡是在权限掩码中出现的权限都不应该在最终权限出现。实际中我们只关注权限掩码的后三位。
实例:
此图很好的解释了为什么先前我们创建的目录权限为775,而普通文件的权限为664。
普通文件的默认权限是从666开始的,目录文件的默认权限是从777开始的,但是最终权限 != 默认权限。原因就在于存在权限掩码umask。这也就导致Linux最终权限 = 默认权限“去掉”umask中存在的权限。换句话说就是凡是在权限掩码中出现的权限都不应在最终权限中出现。
- 问:上述所说的去掉是减法吗?是拿普通文件或目录的默认权限的二进制减去默认权限掩码的二进制吗?
首先,umask的值是可以更改的,如下我们更改umask的值为003
如果按照最终权限是通过减法完成的,那么我们新创建的文件的最终权限值理应如下:
如若是减法,权限值为663,可实际测试的结果并不是这样的,如下:
虽然我们把权限掩码umask的值更改为003,可是最终的权限值并不是我们想象中通过减法获得的664,可见最终权限不是通过减法完成的。
- 那么最终权限到底如何计算呢?
首先,对默认权限掩码按位取反,接着拿按位取反后的结果与文件的默认权限进行按位与的操作 ,得到的就是最终权限。
综上,最终权限 = 默认权限 & (~umask)。
了解了普通文件的rwx可读可写可执行,现在来看看目录的rwx的含义:
- r可读权限: 如果目录没有可读权限, 则无法用ls等命令查看目录中的文件内容.
- w可写权限: 如果目录没有可写权限, 则无法在目录中创建文件, 也无法在目录中删除文件.
- x可执行权限: 如果目录没有可执行权限, 则无法cd到目录中.
在Linux中,可以存在一些目录,拥有者和所属组是root,其它人允许以other的身份在该目录下进行文件的创建,读取,删除,修改等。如下的一个名为tmp的目录:
该目录的拥有者和所属组均属于root,且other其它人的权限都是没有限制的,也就是说任何人都可以在里头读写文件。
示例:
首先,我利用root用户在普通用户其中一个目录下创建目录all,并更改其权限为777。此时我普通用户作为other也能看到此目录all。
接着我普通用户xzy和zxy都进入到这个all目录下,分别创建好各自的文件后打卡如下:
现在test.c文件的拥有者属于xzy用户,而我zxy用户就是test.c文件的其它人,现在zxy用户竟然可以删掉属于xzy用户的文件test.c:
只要all目录下的可写w权限是允许的,那么就可以随意删除该目录下的文件,不论该文件是不是属于你自己的用户,这么看显然是不合理,为了解决这个问题,Linux推出了粘滞位。
如果我还想把某一文件放到共享目录下,但又不想让别人删掉,就需要给共享的目录加上粘滞位。首先我们切回root用户,执行 chmod +t all 命令即可:
给共享目录all加上粘滞位后,此时other其它人的权限由rwx变成rwt。此时就可以防止在共享目录的文件被别人删除了:
综上:当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
- 一、超级管理员root删除
- 二、该目录的所有者删除
- 三、该文件的所有者删除
功能说明:辨识文件类型。
语法: file [选项] 文件或目录...
常用选项:
- -c 详细显示指令执行过程,便于排错或分析程序执行的情形。
- -z 尝试去解读压缩文件的内容
示例: