目录
[命令:su [用户名]](#命令:su [用户名])
[1. 文件访问者的分类(人)](#1. 文件访问者的分类(人))
[1' root、user1......对应的是具体的人](#1' root、user1……对应的是具体的人)
[2' 为什么不见other?](#2' 为什么不见other?)
[3' 什么是所属组?为什么要有所属组?](#3' 什么是所属组?为什么要有所属组?)
[2. 文件类型和访问权限(事物属性)](#2. 文件类型和访问权限(事物属性))
[4' eg. -rw-r--r--](#4' eg. -rw-r--r--)
[1. chmod](#1. chmod)
[2. chown](#2. chown)
[3. chgrp](#3. chgrp)
1.shell命令以及运行原理

root@iZ5waahoxw3q2bZ \~\]# ls -a #后面为命令,#及前为命令行 **用户名 主机名 当前用户所处的工作目录** **提示符:#:root $:普通用户** **外壳程序{操作系统内核} 命令行#**  我们将获取用户输入,将输入的内容交给操作系统,然后操作系统执行,执行完再翻译交给用户 我们称之为命令行解释器 Linux严格意义上说的是一个操作系统,我们称之为"核心(kernel)" ,但我们一般用户,不能直接 使用kernel。而是通过kernel的"外壳"程序,也就是所谓的shell,来与kernel沟通。如何理解?为 什么不能直接使用kernel? 从技术角度,Shell的最简单定义:**命令行解释器(command Interpreter)** > ****主要包含:**** > > **• 将使用者的命令翻译给核心(kernel)处理。** > > **• 同时,将核心的处理结果翻译给使用者。** > 对比windows GUI,我们操作windows 不是直接操作windows内核,而是通过图形接口,点击,从而完成我们的操作(比如进入D盘的操作,我们通常是双击D盘盘符.或者运行起来一个应用程序)。 > > shell 对于Linux,有相同的作用,主要是对我们的指令进行解析,解析指令给Linux内核。反馈结果在 通过内核运行出结果,通过shell解析给用户。 ### 1.shell的理解---感性理解  小张特别不擅长和女生打交道,通过王婆去说媒。如烟就是王婆要去说媒的对象 类比:操作系统---如烟,外壳:shell---王婆,用户----小张 > 小张跟王婆说我就喜欢如烟,王婆传递给如烟,如烟表示不感兴趣,王婆就回来告诉小张 > > 相当于用户输入命令给外壳,外壳把这个信息传给操作系统,操作系统表示执行出错了,外壳返回错误信息给用户! 为什么不让用户去直接访问操作系统呢?因为用户不擅长直接与操作系统交互 用户如果输入一个非常不合理的请求,外壳可以直接拒绝,也变相保护了内核 小张之后再次请求,王婆采用实习生模式,让实习生帮忙做 王婆就是外壳程序,如果有新的命令到来,会创建子进程(实习生)去进行对应的命令 所以 > **为什么要存在外壳程序? > 1.方便用户操作 > 2.外壳程序,保护内核 > 3.外壳程序-\>进程-\>新命令到来-\>创建子进程** shell vs bash 如果说shell是媒婆,那么bash就是王婆.shell是所有外壳程序的统称 linux中具体的shell叫做bash,还有其他的叫sh、xsh.....  ## 2.Linux权限 Linux下有两种用户:超级用户(root)、普通用户。 权限高 权限低,受限 windows:管理员(admin)or普通用户 • 超级用户:可以在linux系统下做任何事情,不受限制 • 普通用户:在linux下做有限的事情。 • 超级用户的命令提示符是"#",普通用户的命令提示符是"$"。 接下来 vim myprocess.c  > gcc myprocess.c -o myprocess  现在想把我们自己写的这个程序安装到系统中,不想以./的方式执行。 安装的本质就是把这个拷贝到/usr/bin 目录下  我们现在切换用户 > > ### **命令:su \[用户名\]** > > **功能:切换用户。** > > **例如,要从root用户切换到普通用户user,则使用 su user。 要从普通用户user切换到root用户则使用 su root(root可以省略),此时系统会提示输入root用户的 口令。** su user1   然后用这个用户去执行  结果发现Permisson denied,权限不允许。usr/bin/ 不允许普通用户修改 然后切回超级用户,cp myprocess /usr/bin 之后myprocess就可以了  > 普通-\>超级:su/su - > > su不做路径变化,su -做路径变化 > > 权限级别高 > > > 超级-\>普通:su 用户名 > > 不需要密码 > > > 本质:可以让用户进行身份变化,提高权限! ## 3.Linux权限管理 > **sudo权限 > # 管理员需要执行的命令 > 给权限 usermod -aG wheel user1 > 移除 gpasswd -d user1 wheel** > **sudo:是用来进行指定的短暂提权的 > 比如:安装软件,安装到系统中,需要管理员root权限...其实只安装了一份,允许大家同时使用 > 人人都是root? > root不给权限就会: > whoami-\>普通用户-\>sudo ls-\>报错**  类似于白名单的东西 在这里面改 切换为root用户,  把user1用户添加进去  切回user1用户,然后sudo ls  ### 1. 文件访问者的分类(人) • 文件和文件目录的所有者:u---User(中国平民 法律问题) • 文件和文件目录的所有者所在的组的用户:g---Group(不多说) • 其它用户:o---Others (外国人) **权限** > **是什么? > 权限本质是:能或者不能做什么事情** > > **为什么? > 1.控制用户行为,防止错误的发生 > 2.理解: > 权限首先限制的是角色"人" > 权限要求目标必须具备对应的属性** > > > **权限=角色+目标权限属性 Linux下一切皆文件,面对的都是文件! ---读、写、执行** **角色: eg 1.拥有者 root 2.所属组 user1 3.other** #### **1' root、user1......对应的是具体的人** **拥有者、所属组、other是角色 角色由对应的人来扮演 并不冲突,是互相补充的!** #### **2' 为什么不见other?** **other不需要记录 只要不是拥有者、所属组,那就是other** #### **3' 什么是所属组?为什么要有所属组?** **要精细化的权限管理,首选要有更精细化的的身份角色** ### 2. 文件类型和访问权限(事物属性) **• 文件类型:** > ◦ d:文件夹 > > ◦ -:普通文件 > > ◦ l:软链接(类似Windows的快捷方式) > > ◦ b:块设备文件(例如硬盘、光驱等) > > ◦ p:管道文件 > > ◦ c:字符设备文件(例如屏幕等串口设备) > > ◦ s:套接口文件 • 基本权限: > > ◦ 读(r/4):Read对文件而言,具有读取文件内容的权限;对目录来说,具有浏览该目录信息 的权限 > > ◦ 写(w/2):Write对文件而言,具有修改文件内容的权限;对目录来说具有删除移动目录内文件的权限 > > ◦ 执行(x/1):execute对文件而言,具有执行文件的权限;对目录来说,具有进入目录的权 限 ◦ "---"表示不具有该项权限 > **r读、w写、x可执行** > > #### **4' eg. -rw-r--r--** > > **第一个是文件类型 > rw- 代表拥有者权限位 > 三个位置:rw- > 代表:允许读、允许写、允许执行 > 第一个位置:可读就是r否则- > 第二个位置:可写就是w否则- > 第三个位置:可执行就是x否则- > r-- 代表所属组权限位 > r-- 代表other权限位**  描述一下,这个文件的权限信息是什么? 该文件的拥有者是user1可以进行读写但不能进行执行,所属者是user1可以进行读写但是不能进行可执行,other对于该文件只有读权限没有写没有可执行 #### **怎么办?实操** **文件访问权限的相关设置方法**  首先让拥有者u去掉r权限,chmod u-r my.txt,从而就不具备这个权限了 还可以继续加回来  给所有去掉rwx权限  给所有加上r权限,加上w权限  > **重点部分: > 1.能改任何人的所有权限吗? 用户只能更改自己的文件权限 > 2.没有权限会怎么办? 系统会拒绝让我们访问 > 3.实际在确定权限信息的时候,系统会先确定用户是谁?拥有者,所属组,还是other? > 在Centos下,用户角色确定,只确定一次,顺序是:拥有者,所属组,other > 4.root用户的权限 > 不受权限约束!** > > **5.如何理解可执行? > 可执行权限 != 文件可以执行 > 一个文件可不可以执行还是要看本身是不是可执行文件,并不是说有可执行权限x就可 执行** **必须两个条件同时满足才可** 下图就是想用user1给root的文件改权限,那么就会拒绝访问   此处my.txt的拥有者权限被改为root  现在cat一下 \>\>重定向一下 **为什么现在又能读又能写了呢?** > **因为系统在确认当前用户对于指定文件的权限时,首先判断当前用户跟所有者比较** > > **结果发现不是,不是就不看拥有者了,就看所属组,然后匹配成功了,于是就可以用所属组的权限了** 相当于顺位 > > #### 权限检查的"顺位"逻辑 > > 当用户访问一个文件(或目录)时,系统按以下顺序判断权限: > > 1. **第一顺位:用户(UID)** > > 如果当前用户的 UID 与文件所有者 UID 匹配,则应用**所有者权限**,检查结束。 > > 2. **第二顺位:组(GID)** > > 如果不匹配,则检查当前用户是否属于文件的**所属组** (或文件的附加组列表)。 > > 如果属于,则应用**组权限**,检查结束。 > > 3. **第三顺位:其他(Other)** > > 如果前两者都不匹配,则应用**其他用户权限**。 **权限=角色+目标权限属性** #### **更改人** 那么怎么更改人呢? chown拥有者 chgrp所属组  **系统默认不允许我们把文件给别人---是合理的!** **想给别人,必须高权限!-------sudo/su(切换为root)** sudo chown user1:user1 root.txt直接一次性把拥有者所属组都改了  ### 3.重谈修改文件属性: **允许读、允许写、允许执行---两态的 r/- w/- x/- 1/0 1/0 1/0** **所以说也可也采取八进制方案对文件进行修改** eg. -rw-rw-r-- 110 110 100 6 6 4 chmod 000 hello.txt  ### 文件权限值的表示方法 > **• 字符表示方法** > > **• 8进制数值表示方法** ### 文件访问权限的相关设置方法 #### 1. chmod **功能:设置文件的访问权限** **格式:chmod \[参数\] 权限 文件名** > 常用选项: > > • R -\> 递归修改目录文件的权限 > > • 说明:只有文件的拥有者和root才可以改变文件的权限 chmod命令权限值的格式: • 用户表示符+/-=权限字符 ◦ +:向权限范围增加权限代号所表示的权限 ◦ -:向权限范围取消权限代号所表示的权限 ◦ =:向权限范围赋予权限代号所表示的权限 ◦ 用户符号: u:拥有者 g:拥有者同组用 o:其它用户 a:所有用户 ◦ 实例: > ▪ chmod u+w /home/abc.txt > > ▪ chmod o-x /home/abc.txt > > ▪ chmod a=x /home/abc.txt • 三位8进制数字 > ◦ 实例: > > ▪ chmod 664 /home/abc.txt > > ▪ chmod 640 /home/abc.txt #### 2. chown **功能:修改文件的拥有者** **格式:chown \[参数\] 用户名 文件名** > **实例:** > > **• chown user1 f1** > > **• chown -R user1 filegroup1** #### 3. chgrp **功能:修改文件或目录的所属组** **格式:chgrp \[参数\] 用户组名 文件名** **常用选项:-R 递归修改文件或目录的所属组** **实例: chgrp users /abc/f2** ## 4.三个问题---A目录权限 ### 1.如果我想进入一个目录,需要什么权限? > **必须具备x权限,才能进入** ### 2.rw分别对目录意味着什么? > **如果对目录没有r,就无法查看目录里面的文件 > 如果对目录没有w,就无法在指定目录内部新建文件** > > **重申:超级用户不受权限约束** > > **所以说,默认情况下,我们新建一个目录,rwx权限都要有!** ### 3.如何理解Linux多用户之间是怎么互相"隔离"的? > **任何用户,无法进入其他用户的家目录(除超级用户root)**  ## 5.umask > **功能:** > > • 查看或修改文件掩码 > > • 新建文件夹默认权限=0666 > > • 新建目录默认权限=0777 > > • 但实际上你所创建的文件和目录,看到的权限往往不是上面这个值。原因就是创建文件或目录的 时候还要受到umask的影响。假设默认权限是mask,则实际创建的出来的文件权限是: mask \& \~umask **格式:umask 权限值** **说明:将现有的存取权限减去权限掩码后,即可产生建立文件时预设权限。超级用户默认掩码值为 0022,普通用户默认为0002。** ## 5.三个问题---B缺省权限 ### 1.为什么默认权限是我们看到的样子?  > **对于普通文件来说,起始权限666,默认不带可执行 > 对于目录文件来说,起始权限777,默认携带x** ### 2.为什么跟这个不匹配 **因为系统默认会存在一个叫做权限掩码的概念。 最终权限=起始权限 \& (\~umask) \&(按位与)** #### 1.unmask目的是什么? > **希望凡是在umask中出现的权限,都不应该在最终权限中出现** #### 2.为什么要有umask? > **a.默认权限,由OS自主决定,无法在创建前进行修改---系统可配置,可以灵活满足需求的一种表现 > b.特殊情况下,通过配置umask,可以控制文件的默认权限,让我们的代码都是可控的**  ## 6.三个问题---C粘滞位 **看到一个现象:** > **一个文件是否能被删除,与文件本身无关,与文件所处的目录w权限有关!** ### 有没有问题? **没有问题** ### 那如果两个文件之间要进行文件级别的协作呢? **不能放在任何一个私人账户里** ls /tmp -d ls -l / tmp里面通常放一些临时文件  **在非普通账号下建一个,一般放在根目录 这样全系统就能共享** **共享类文件,不想让非文件的拥有者删对应的文件** **新需求:任何一个人都能在共享下新建,但是不想让非拥有者删除(****与文件所处的目录w权限有关!** **) 所以引入一个新的权限标志位:t,粘滞位** > **当一个目录被设置为"粘滞位"(用chmod +t),则该目录下的文件只能由** > > **1. 超级管理员删除** > > **2. 该目录的所有者删除** > > **3. 该文件的所有者删除** chmod +t tmp/ 此时对应的other权限位变为t eg.drwxrwxrwt 此时就删不掉了,权限位约束 让共享情况下,非拥有者不能删除 (当然了对于root来说还是可以删) **粘滞位特征:只能给需要共享的目录添加粘滞位** 感谢你的阅读,期待我们下次再见!!!