权限学习
1. shell命令以及运行原理
Linux严格意义上说的是一个操作系统,我们称之为“核心(kernel) “ ,但我们一般用户,不能直接使用kernel。而是通过kernel的“外壳”程序,也就是所谓的shell,来与kernel沟通。如何理解?为什么不能直接使用kernel?
从技术角度, Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
- 将使用者的命令翻译给核心(kernel)处理。
- 同时,将核心的处理结果翻译给使用者。
对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。
shell 对于Linux,就是命令行解释器,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在通过内核运行出结果,通过shell解析给用户。 如果用户进行非法操作,shell就可以把这些非法请求拦截下来,也是对操作系统的一种保护。
我们centos 7常用的命令行解释器(shell),叫做bash,它是一个可执行的外壳程序。
shell是所有外壳程序的一种统称,而bash是一款具体的外壳程序。
2. Linux权限的概念
Linux下有两种用户:超级用户(root)、普通用户
- 超级用户:可以再linux系统下做任何事情,不受限制
- 普通用户:在linux下做有限的事情
- 超级用户的命令提示符是“#”,普通用户的命令提示符是“$"。
命令: su [用户名]
功能:切换用户。
例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的口令。
whoami
//Yuucho
切换为root建议用:su -
//Password:
whoami
//root
logout
whoami
//Yuucho
在root用户下,可以直接转换到任意一个用户,无需密码。
3. Linux权限管理
Linux系统中不是以文件后缀区分文件类型的,而是通过ll显示的第一个字符区分文件类型的!
-:普通文件,文本,源代码,可执行程序,第三方静态库等
d:目录文件
l:链接文件
p:管道文件
b:块设备文件,磁盘
c:字符设备文件
注意:在gcc下文件要按照严格的后缀区分,因为gcc并不是Linux操作系统,而是Linux使用的一个编译器软件。
3.1文件访问者的分类(人)
生活中什么是权限?
- 约束人的(对人进行分类)
- 需要对应的事物具有特定的属性
Linux中,对文件的权限:
- 这个文件谁能"访问",这个文件谁不能"访问"
- 对应的文件应该具备的某种属性:r、w、执行权限x
权限=人+事物属性,所以权限的概念以及操作都是围绕着人和文件属性展开的!
Linux中,人分为3类:
- 文件和文件目录的所有者:user
- 文件和文件目录的所有者所在的组的用户:group
- 其它用户:other
root和普通用户与Linux中3的类人并不冲突,反而是相互补充的。也就是说root或者普通用户都可以是3类人中的任意一种。
为什么Linux中会有所属组?给自己所在团队成员给予文件访问权限。
3.2.文件类型和访问权限(事物属性)
注:“—”表示不具有该项权限
3.3 文件权限值的表示方法
- 字符表示方法
- 8进制数值表示方法
3.4.文件访问权限的相关设置方法
3.4.1 改文件权限
- 用户表示符+/-=权限字符
去掉myfile.txt文件所有者的读权限:chmod u-r myfile.txt
去掉myfile.txt文件所属组的读权限:chmod g-r myfile.txt
去掉myfile.txt文件其他人的读权限:chmod o-r myfile.txt
加上myfile.txt文件所有者的读和执行权限:chmod u+rx myfile.txt
......
还可以任意组合:chmod u-r,o-r,g-r myfile.txt
chmod a=r myfile.txt 所有人都拥有读权限,a代表all
......
注:root虽然是other,但是它无视这些权限的规则,照样读写执行。
- 八进制方案:这里八进制理解上是二进制,1代表有,0代表无。每一个8进制数字代表一组权限。
chmod 777 myfile.txt 所有人拥有所有权限
3.4.2 改人
chown root myfile.txt 将root改为文件所有者
但是上述操作并不能完成,因为当你给一个人东西时还要征求对方是否同意。且文件的创建者和文件的拥有者可能并不是同一个人。
我们可以通过提升权限:以root的身份去运行程序chown。
sudo chown root myfile.txt
也可以转换为root用户进行改人操作。
su -
//password:
chgrp zs myfile.txt //将张三改为文件的所属组
sudo chown zs:zs myfile.txt //将张三改为文件的所有者和所属组
大家如果执行sudo报错,可能是因为没有配置信任列表文件。
4. 目录的权限(重要)
如果我想进入一个目录,需要什么权限?
需要目录的x权限
如果目录只没有r权限,允许进入,允许在该目录下创建(写入)一个文件,不允许查看文件列表。
如果目录只没有w权限,允许进入,允许在该目录下查看文件,但是不允许创建文件。
如果同时没有rw权限,允许进入,但是不允许创建和查看目录下的文件列表(注意:不是文件内容!!文件的内容是否可以查看,由文件自己的权限决定!!)
4.1 如何理解?
Linux下一切皆文件,目录也是文件,文件 = 内容 + 属性
如果一个目录没有r权限就无法查看文件列表,但是我知道在此目录下有一个file1.txt文件,我可以查看文件的内容吗?我在centos 7 测试发现是可以的。
你想访问文件,前提是你得先找到它。Linux中我们是通过路径找到这个文件的。
这里能访问的原因可能是文件名和id之间是有对应的映射关系的,有可能被系统缓存了。
4.2 目录和普通文件的默认权限
为什么我们创建目录的默认权限是775?为什么我们创建的普通文件的默认权限是664?(不同系统可能存在差异)
首先我们要知道目录的起始权限是777,普通文件的起始权限是666。
其次我们得认识一下权限掩码:
umask
//0002 第一个0表示八进制,我们只关心后3位
凡是在权限掩码中出现的权限都不应该在最终权限中出现!
怎么证明是否是减法?
我们可以更改权限掩码来多看几个例子:
umask 000 //将权限掩码设置为0000
当我们把权限掩码设置为0003时,文件的最终权限应该是663,但是我们发现实际上文件的权限是664。
最终权限 = 默认权限 & (~umask)
5. 粘滞位
5.1什么是粘滞位?
有时候我们需要一个目录,这个目录可以让所有人删除或创建临时文件,我们Linux系统当中就有这样的目录:tmp。tmp的拥有者和所属组是root,其他人允许以other身份在该目录下进行文件的创建,读取,删除,修改等。
在一个共享目录下,你的文件不让我写,不让我读,但防不住我删除!
如果我还想在共享目录下,形成临时文件。但是,不允许除了我之外的人删除!
方法是给共享的<目录>加上粘滞位!
假设有一个共享目录all
chmod +t all //加上粘滞位后别人无法删除
tmp目录默认带有粘滞位。
当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由
一、超级管理员删除
二、该目录的所有者删除
三、该文件的所有者删除
6. file指令
功能说明:辨识文件类型。
语法: file [选项] 文件或目录…
常用选项:
- -c 详细显示指令执行过程,便于排错或分析程序执行的情形
- -z 尝试去解读压缩文件的内容。