一 、文件和目录的权限
(1)查看文件和目录的相关信息---> ls :list
说明:命令的参数用到再查!
-a 列出目录下的所有文件,包括以.开头的隐含文件(all)--->常用1
-A 列出目录下的所有文件(包括隐藏文件但不包括.和..目录)
-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。
-c 输出文件的 i 节点的修改时间,并以此排序
-d 仅列出目录本身(目录像文件一样显示),而不显示其下的文件(directory)-->常用2
-e 输出时间的全部信息,而不是输出简略信息。
-f 对输出的文件不排序(默认的)
-F 根据文件目录信息给予附加的数据结构(*-->可执行文件;/-->代表目录;=-->代表socket文件;|-->FIFO文件;@-->符号链接)
-h 将文件容量以GB、KB、M等形式列出来-----> du -sh(显示文件的大小)-->常用3
-i 输出文件的 i 节点的索引信息(文件被系统记录的次数)
-k 以 k 字节的形式表示文件的大小
-l 列出文件的详细信息(文件的属性和权限等)-->常用4
-m 横向输出文件名,并以“,”作分格符。
-n 用数字的 UID,GID 代替名称
-o 显示文件的除组信息外的详细信息(同 U)
-r 将结果反向输出(reverse)
-R 连同子目录的内容一并列出来,该目录下的所有文件都会显示出来--->常用5(类似于tree命令)
-S 以文件的容量排序(size)
-t 按时间排序
小技巧:ll的alias功能
后续:文件的过滤(涉及正则表达式)--->F的应用(shell中)!
思考:问什么我们可以在任意用户下的任意目录下执行命令(eg:/bin/ls命令)?
解答:类比Java中要设置java和javac的命令一样,需要将命令加到系统的环境变量路径中!
执行逻辑:系统首先会从当前目录查找该命令,如果没有则从系统路径变量(PATH)中去查找!
图1
图2
说明:后续省略。。。
###########################################
需求1:在不同的用户下列出查询的路径
结果:由一堆目录组成!
说明:root和普通用户下,二者目录有区别,但是二者都有共性的地方(PATH下都有/bin目录),这也是思考的回答!
思考:如果PATH中有多个相同的命令(目录结构不一样),哪个命令先执行------>顺序(谁先被查询)
######################
需求2:上面我们知道某些命令的目录不在PATH中,但是我们还想执行此条命令怎么办?
首先先进行判断:
(1)如果权限允许:通过绝对路径去执行该命令
(2)如权限不允许:则启用超级用户即可---(超级用户root--->visudo--->99行编辑相应的配置文件--->切换普通用户去执行 sudo命令)
################
####文件权限####
################
二、权限信息
(1)概念引入
ls -l touch 4.c
####################
####文件权限和属性####
####################
####1、文件属性的查看####
ls -l filename
- | rw-r--r-- | 1 | root| root| 46 | Mon 1 05:03 |filename|
|---|-----------—|---|-----|—---—|------|---------—---|--------|
1 2 3 4 5 6 7 8
1)文件类型说明
- ##普通文件(各种类型的--->常用)
d ##目录(directory)
c ##字符设备(character)
s ##套接字(socket)
p ##管道(pipe)
b ##快设备(block)
l ##连接(软链接link-->快捷方式)
相应的文件说明:
说明1:字符设备文件,我在讲重定向的时候提到过,图示也回答了之前的提出问题(c的含义)!
说明2:socket是软件和内核通信的一个接口,默认软件是封闭的,如果删除了,就无法同系统建立通信!
###############################
2)文件属性权限
rw---—r-- ==>
u(所有人的权限):rw-;g(所有组对其操作的权限):---;o(其他人的权限):r--
3)连接数的含义
对文件:文件内容被系统记录的次数-->官方术语(硬链接的个数-->inode)!
对目录:默认是一级子目录的个数(包含两个隐藏目录)-->!
图1
说明:测试的时候Desktop已经有一个temp的目录了!
4)文件所有人(并不一定最初由其创建就属于他,理解为房子的买卖,易主了)
5)文件所有组,初始组或者中途又改变的组!
6)
文件:内容的大小,默认是字节!
目录:记录文件属性的字节数,而不是目录的大小!
图2
注意:倒数第二行是"9+7"
7)默认是内容最后一次发生改变的时间
文件:最后一次被修改的时间
目录:文件名移动的最后一次时间(创建、删除、移动、重命名等)
8)文件或目录的名字
####################################################
2、改变文件的权限和属性(归属)
弄清楚:用户和其他人;以及用户组和其它组!
(1)属性的改变------>文件所有人、所有组的管理
理解上:ch--->change;own--->owner;grp--->group
chown username file|dir
##更改文件或目录的所有者(类似于让文件的归属易主,相当于创建文件时指定)
chown username{.,:}groupname file|dir
##更改文件的所有者和所属组---->推荐":"来隔开
chown -R username dir
##更改目录(针对)本身及里面所有内容的所有人(username)
chgrp -R groupname(组名) dir
##更改目录(针对)本身及里面所有内容的所有组(groupname)
chgrp -R user.groupname(组名) dir
##更改目录(针对)本身及里面所有内容的文件或目录所有者以及所属的用户组!
注意1:普通用户的属性可以被root和自身修改!
注意2:超级用户的属性权限只能被自身修改!
(2)权限的改变
rw-r--r--
u:文件所有人对文件可以读、写(前三个)
g:文件组成员对文件可读(中间三个)
o:其他人对文件可读---->好好体会(其他人是相对于该用户组的人,不是相对于该用户的人)
说明:这里暂时不讨论文件和目录的权限意义,仅讨论权限的修改!
细化:cp 和 mv的权限说明(后续)
#########################################
更该权限的方式:数字类型和符号类型
1)数字类型改变文件的权限(二进制---常用)
语法:chmod 【-R(目录递归权限修改)】三位数字(顺序对应ugo权限修改) 文件或目录
说明1:【..】表示非必须的参数,这里主要是针对目录里面内容的修改!
说明2:权限与数字的影射关系(r--->4;w-->2;x-->1)---->每一位(u\g\o)的权限是三个数字的累加和!
775------>(4+2+1)(4+2+1)(4+0+1)------>(u=rwx)(g=rwx)(o=r-x)
2)符号类型改变文件的权限
语法:chmod 【-R】 {u,g,o,a} {+,-,=} {rwx} file|dir
说明:a(表示三者)、+(表示添加权限)、-(表示去掉权限)、=(表示设置)
###############################################
需求1:想让一个用户拥有文件的执行权,但是却不知道该文件原本的权限
chmod a+x filename
# 前提是有进入该目录的权限,即目录的权限是x
说明:此用户不知道是什么级别的用户(三种都有可能)!
##############################
需求2:让文件所有者有读写的权限,文件所属组和其他人只有读的权限
测试(简写形式):chmod u=rw,go=r filename
等价形式(原生):chmod u=rw-,g=r--,o=r-- filename
注意1:ugo以逗号隔开!
###############################
文件所属组概念:是以文件所属用户所在的用户组!
注意2:对于"-(减)"如果其本身就没有权限则无效,对于"+(加)"如果其本身就有该权限则无效!
补充:
chmod u-x file1 ##file1拥有者去掉x权限
chmod g+w file1 ##file1拥有组添加w权限
chmod u-x,g+w file1 ##file1拥有者去掉x权,file1拥有组添加w权限
chmod ugo-r file2 ##file2的用户组其他人去掉r权限
chmod ug+x,o-r file3 ##file3用户和组添加x权限,其他人去掉r权限
chmod a+(-){r|w|x} file4 ##file4用户和用户组其他组全部进行相应的修改
++++++++++++++++++++++++++++++++++++++++++
chmod {+,-}w 文件--->都是只操作文件本身的所有者-->由于安全问题!-->信息提示
即:chmod u+w 文件
chmod {+,-}w 目录-->同上
常见场景的说明:
文件-->目的
(1)修改普通文件-->一般是(rw-)!如果是(-w-)则vim 文件-->无法查看文件的内容,但是由于可以修改,容易覆盖源文件的内容,而不知情!
(2)执行文件--->一般是(r-x)!如果是(--x)则读取不了文件的内容不能执行!
即:r-x(常常是二进制的可执行文件或者脚本)
###################分割线##############################
目录-->目的
(1)修改目录的内容-->一般目录是(rwx)
如果是(-wx)-->没有r则无法自动补全,但是可以异动目录的列表内容!
如果是(-w-)-->则无法进入目录,何谈修改里面的内容!
(3)目录和文件权限的意义
引入:上面做了那么多操作,我们已经初步掌握了修改文件属性和权限的操作,但是对于文件的和目录的rwx你真正了解的含义吗?而文件和目录的权限又有哪些区别呢?
分两步走:权限对文件的重要性以及权限对目录的重要性
1)权限对文件的重要性
文件的种类:一般文本文件、数据库的文件、二进制的可执行文件等!
我们知道文件存在的目的:主要是存储数据的,存储数据后总得查看,有时是不是还得修改,有的文件还需要被系统执行。
注意:系统肯定会尽最大的努力保护系统的稳定性,即对于默认创建的文件总是限制其执行权限,以免导致文件执行导致系统崩溃,这也是umask系统对文件权限限制的由来(后续再讲)!
r(read):可以读取此文件的内容------>常用命令{cat,less,more,head,tail等}------前提:得进入文件所在的目录中!
w(write):对文件内容的操作(写入、添加、修改)----->注意:不包含删除文件----->着眼点(文件的内容)
x(execute):该文件具有能被系统执行的权限,但是前提必须获得r的权限!
x细化:一个文件是否具有执行能力不是通过"扩展名"来判断的,要区别于Windows!
判断Linux下文件是否能被执行:看否具有的"x"权限来决定的,跟文件名没有绝对的关系
说明:虽然二者没有必然的联系,但为了见名知意,通常都以文件的后缀名来表明文件相应的类型,例如:.{c,java,php,py}等
2)权限对目录的重要性
引入:我们知道文件的主要作用是存放数据,那目录的主要作用是干什么的?
目录的主要作用:展示目录内容的,那目录的主要内容是什么呢?
目录的主要内容是:记录文件名(目录)的列表!
分析:rwx对目录的影响
r(read contents in directory):表示有读取目录结构列表的权限(即:可以查询目录下文件和目录的信息)------>相应的命令 ls
w(modify contents in directory):表示具有更改('编辑')目录内容的权限,即目录内容发生变化,那么内容发生变化的情况如下:
1)新建文件和目录(是在当前目录下,不包含当前目录下在子目录中新建文件和目录,如果要完成后者,看子目录的权限
2)删除已存在的文件和目录(注意:不管子目录下是否有内容也会一并干掉,需要递归删除吗?)
3)重命名已存在的文件或目录
4)移动该目录的文件和目录------> mv
x(access directory):表示的是用户是否能进入该目录,使该目录成为工作目录---->相关命令(cd )
举例:小明对某个文件具有可执行的权限,但是对文件所属的目录没有执行权限,无法进入,只能望而兴叹!
后续:文件或目录的权限下可以干什么?------->尽可能利用一些权限来完成目标需求!
#########################################
(4)系统默认权限的设定
需求上分析:从系统安全角度来说,开放权力越少,系统安全性越高;但是如果开放的权力过多,便捷性下降了,安全级别下降了,为了找到一个平衡点,出现了余留权限--->umask,即系统设定新建文件或目录会默认减掉一些权限!
说明:不同的用户登陆下默认的权限不同!
(1)超级用户(本来权限比较大,系统会制约的狠些):
umask值默认是0022(减去的权限),创建的目录的权限(755),创建文件的权限[644,默认满权限是666,没有执行权限]
原因:内核--->x(病毒、木马是可执行的)-->不安全!
(2)普通用户(本来权限比较小,系统会制约的一般):
umask值默认是0002(减去的权限),创建的目录的权限(775),创建文件的权限[664,默认满权限是666]
共性:系统分配文件的默认满权限是666(剪掉了执行权,最大限度的保证了系统的安全性!)
执行流程:先判断类型(是文件还是目录)----->再根据用户的级别(一般还是超级)减去相应的umask----->得到文件或目录的最终权限
umask含义:用户默认减去的权限(umask的注意事项!!!!!!!)
###########################################
需求1:查看用户的umask的系统默认剪掉的权限------>umask
需求2:临时设定(更改)用户的umask ------>umask 077------>特点:只当前shell环境中生效!
需求3:永久设定方式(不建议)------>修改配置文件------>编辑/etc/bashrc ##shell脚本
:set nu------>:70行显示如下的信息------>修改配置文件------>:wq保存退出
70 if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
71 umask 002 ##普通用户umask
72 else
73 umask 077 ##超级用户umask
74 fi
同时修改配置文件:vim /etc/profile (系统配置文件)--->第59行
59 if [ $UID -gt 199 ] && [ "`id -gn`" = "`id -un`" ]; then
60 umask 002 ##普通用户umask
61 else
62 umask 077 ##超级用户umask
63 fi
注意:以上两个配置文件的umask设定值必须保持一致!
补充:文件下载后默认权限依据哪一个?
设定立即生效:source /etc/bashrc、source /etc/profile或用.来替代source!
注意:在root下修改这两个配置文件,要同步!
##########################特殊权限##########################
特殊权限
限制root的权限!
引入:我们发现 /tmp以及 /usr/bin/passwd的权限有些奇怪?
思考:不是只有r、w、x吗?这些特殊权限的(s、t)的含义是什么?
过渡:对应的Xwindows资源管理器图形展示!
生活案例:扫地的工具是用户A的,但是真正打扫干活的人是用户B!
案例演示:
明确:这两个权限的意义与系统的帐号以及系统的进程有关,后续会讨论!
情景模拟:Linux系统下所有的账户的密码都记录在/etc/passwd这个文件中------1>这个文件的权限是 -r---------1 root root------2>意思:这个文件仅有root可读且仅有root用户可以强制写入------3>思考:一般账户能否自行修改自己的密码?
发现:当然可以修改密码------>思考:内在机理呢?为什么没有冲突呢?
#############SUID###############
原因:SUID的功能------>引出:什么是SUID?
概念:当s标志出现在文件(限定1)所有者(限定2)的x权限中(限定3)时,是冒险位,此时就被称为Set UID,简称SUID的特殊权限!
冒险:普通用户可能临时获取root用户的权限,来获取某种权限,可能产生不可预测的后果!
疑问:SUID权限对于一个二进制文件的特殊功能是什么?基本上SUID有这样的限制和功能:
(1)SUID权限仅对二进制程序(具有s属性的命令)有效;
(2)执行者对于该程序需要有x的可执行权限;
(3)本权限(SUID)仅在执行过程中(run-time)生效;
(4)执行者具有该程序所有者(owner----user)的权限(类似于继承权限),以此身份完成某种功能;
感悟:有点像visudo的此配置文件中加入了特别声明用户可以行使的权力!
##########################################################
案例分析(来自上面的情景模拟):命令------>passwd /tmp
素材:
drwxrwxrwt. 16 root root 4096 Jul 30 03:24 /tmp
-rwsr-xr-x. 1 root root 27832 Jan 30 2014 /usr/bin/passwd
(1)首先/etc/passwd是一个二进制程序---->SUID权限对此二进制文件有效------>满足第一个条件
(2)执行者(student)对于该程序(passwd)有x的可执行权限(判断:student属于其他人,即对应o的属性有x)------>满足第二个条件
(3)student在执行的过程中会临时(暂时)的获取root的权限(相当于此时是root用户登陆)---->对照该文件的root权限----->student用户具有w权限(可以修改此文件)
注意:SUID仅作用于二进制程序,不能够在shell script 中,且SUID对目录无效
SUID的目的就是:让本来没有相应权限的用户运行这个程序时,可以访问他没有权限访问的资源。
设定方式:
chmod u+s file
chmod 4xxx file
##知识点:suid=4
############SGID###############
SGID的概念:当s标示在用户组的x使则称之为Set GID,简称SGID,强制位!
特点:针对文件和目录来设置
(1)针对文件功能如下:
1)SGID属性对二进制程序(具有SGID的权限)有效;
2)程序执行者对于该程序来说具备x权限;首先判断与程序所属者是不是同一组(1),是的话看g权限,(2)不是的话看其他人的权限o
3)执行者(其它用户)在(用这个SGID权限的命令)执行的过程中将会获得该程序用户组(group)的支持!
举例:用 /usr/bin/locate 这个程序(二进制命令)去ll查询 /var/lib/mlocate/mlocate.db这个文件
/usr/bin/locate权限和属性说明: -rwx--s--x 1 root slocate------>SGID权限(二进制程序)
/var/lib/mlocate/mlocate.db属性和权限的说明:-rw-r----- 1 root slocate------>
命令:locate /var/lib/mlocate/mlocate.db
结果:student获取了locate用户组的支持(相当于是slocate用户组的用户登陆),该用户组(slocate)对mlocate.db权限是r--,即能够读取mlocate.db。
过程分析:省略
(2)针对目录功能如下(常见):
1)用户若对此目录具有r和w的权限,该用户能够进入此目录;------>前提是查看目录的权限来判断
2)用户在此目录下的有效用户组(effective group)将会变成该目录的用户组;不修改用户组默认还是用户<----结果(临时的吗?)
id studnet ------>查看用户进入该目录后(前提),有效用户组是否改变(进入前和进入后对比)!
3)若用户在此目录下具有w的权限(表明可以创建文件),则用户所创建的文件的用户组与此目录的用户组相同
模拟场景:/tmp/hello/ ------>目录的权限: rw-r-srw- root root -------->用户是student(默认id student---> student student)
分析:student对此hello目录具有rw的权限(others判断)------>student可以进入/hello目录(虽然此目录)----> id student------>
------>student root (有效用户组由studnet变成root)------>表明student此时也是root组的成员------>具有root组的属性(看目录中root组
具备对目录的属性操作)------>看root组对目录是否有write权限(是否可以创建)
有效用户组:表示用户此时此刻所在的用户组是什么;有些同学会问“难道用户所在的用户组还会来回来去的变么?”。答案是肯定的。这都是newgrp命令搞得鬼,它可以帮助用户转换到不同的用户组。比如newgrp group123,就可以让用户转换到group123用户组了。请注意:这种转换的背后原理是“创建一个新的子shell”,恢复到原来用户组的方法是 用exit或ctrl-D来注销当前的shell。好了,说结论吧:有效用户组就是用newgrp命令所切换到的用户组。(当然,如果你一次也没有使用newgrp命令,那么有效用户组就是初始用户组喽)当然,你可以用groups命令来列出当前用户所支持的所有用户组。(在有些系统中,第一个列出的就是有效用户组,但有些系统并不这么做)还有一点应该注意,就是当你建立一个文件时,此文件的所属用户组就是创建人当前的有效用户组。
思考:如何查看用户的有效用户组?
应用场景:项目开发中,涉及到用户组权限的问题!
说明:条件苛刻,只有在特定的环境下才生效!
思考:强制写入的前提!
-----------------------------------------------------
SBIT(Sticky Bit)目前只针对目录有效,针对others来设置,表示粘滞位,对目录的作用:
(1)当用户对目录具有x,w权限,即具有写入的权限;---->x(表示进入目录),w(操作目录的内容)
(2)当用户在此目录下创建文件或者目录时,仅有自己和root用户有权利删除该文件;
命令:ls -ld /tmp/------>student用户执行
结果:drwxrwxrwt. 16 root root 4096 Jul 30 08:50 /tmp/
分析:最具有代表的就是/tmp目录,任何人都可以在/tmp内增加、修改文件(因为权限全是rwx),但仅有该文件/目录建立者与
root能够删除自己的目录或文件。
小结:SUID/SGID/SBIT------>针对文件(f)所有者(u)、文件(f)或目录(d)的所属用户组(g)、目录(d)的其它组(o)有效
补充:SUID(4<--->s)/SGID(2<-->s)/SBIT(1<-->t)的权限设置,原来的权限是3位---->现在需要四位,首位是三者的特殊权限的累加和
4755的等价形式(数字)<------>u=rwxs,g=r-x,o=r-x(符号)
1755的等价形式<------>u=rwx,g=r-x,o=r-t
实验:chmod 7666 test;ll test----->此时u、g、o都没有x的可执行权限标示?7------sst
现象:大写T和S出现的原因?------>代表空的意思
原因:SUID表示该文件在执行的时候具有文件拥有者的权限,但是文件拥有者都无法执行了,哪里来的权限给其他人使用!
回顾:这也就解释了umask为什么是4位,第一位是特殊权限!
#####################访问控制权限列表####################
acl:access control list
Linux系统:我们额外给指定的用户指定目录分配指定的权限(不使用ugo的权限),也就是 ACL 权限分配!
参数的说明:
(1)设置(开启-->普通)ACL列表
m:modify
setfacl -m u:user:rwx file --->设定user对file拥有rwx权限
setfacl -m g:group:rwx file --->设定group组成员对file拥有rwx权限
(2)查看ACL列表权限
getfacl file|dir
需求1:用户在不开放{u,g,t}普通权限的前提下,赋予特定用户相应操作文件的权力!
链接:高级用法
错误chmod引发的惨案!
说明:为了验证我之前的判断,仍以此文件作为说明
上面的例子说明两个实验现象
(1)chmod g ... 改变了mask进而影响了effective的ACL,而chmod u、o并不影响ACL的mask,进而不影响有效的ACL!
(2)mask权限是ACL最大的上限,授权的ACL不能超过mask数值!
计算原理:当chmod g的方式--->"虚假的g"改变同步于mask,进而"mask&授权的ACL"得到有效的ACL!
&(与)的理解:1&0=0,0&0=0,1&1=1(四种情况),这样显然真实的ACL权限在mask的权限控制之下!
mask的概念:文件的访问权限的上限!
mask的作用:如果说ACL的优先级高于ugo,那么mask就是一个名副其实的最后一道防线,它决定了一个用户/组(ACL授权的)
能够得到的最大的ACL权限,这样我们在不破坏已有ACL的定义的基础上,可以临时提高或是降低安全级别!
注意1:mask只对授权其他用户和组(ACL)权限有有影响,对owner和other的权限是没有任何影响的!
说明: 因为在使用了ACL的情况下,group的权限(复合的<---->虚假的)显示的就是当前的mask!
注意2:每次修改或添加某个用户或组的ACL项的时候,mask都会随之修改以使最新的修改能够真正生效!
计算方式:实际用户可操作的ACL权限=上一次的mask与(&)当前授权用户预设的ACL(在可以控制的范围内)->理解这个很重要!
侧面说明:mask是在动态变化的!
进一步需求(后续补充):所以如果需要一个比较严格的mask的话,可能需要每次都重新设置一下mask!
(3)取消ACL列表权限
setfacl -b file --->关闭file上的acl列表
场景1:不管以前授予ACL给多少用户,统统回收特权!
setfacl -x u:user file --->从acl列表上删除user对file的acl
场景2:对多个不同的用户(不在同一个组)进行acl,授予一段时间后,想取消部分用户的ACL权限!
setfacl -x g:组名 指定文件名 --->去掉指定用户组对文件的权限
场景3:对多个用户(在同一个用户组)进行ACL,不用单个取消,批处理!
(4)特殊情况的说明-->涉及mask相关的数值!
测试:
改变ACL后------>chmod {u、g、o} dir|file
观察实验现象
结论:只有chmod g-{r|w|x} dir|file 才能改变mask数值!
(5)高级的ACL权限列表的设置
核心点--->针对目录
(1)对目录下已存在的文件,递归的改变目录即及当前下内容ACL的权限!
(2)对目录下新建的文件,授予默认的ACL权限
链接1:mask最大有效访问权限
总结
(1)u+s 权限 :suid, 冒险位
效果 : 只针对于二进制可执行文件 , 该命令发起的程序是以该命
令所有人的身份去执行。
(2)g+s 权限 : 强制位
效果 : 针对二进制可执行文件 : 该命令发起的程序是以该命令所
有组的身份去执行 ;
(3)o+t 权限 :sticky, 粘制位
效果 : 只针对于目录 , 当目录上有 o+t 的权限时 , 所有用户在该目录下均可创建文件 , 但只有文件所有人和 root 用户可以删除该目录下的文件