欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux基础命令(四)

程序员文章站 2022-05-08 16:13:17
...

一  文件和目录的权限

(1)查看文件和目录的相关信息

       ls :list

-a 列出目录下的所有文件,包括以.开头的隐含文件(all)--->常用
-A 列出目录下的所有文件(包括隐藏文件但不包括.和..目录)
-b 把文件名中不可输出的字符用反斜杠加字符编号(就象在C语言里一样)的形式列出。
-c 输出文件的 i 节点的修改时间,并以此排序
-d列出目录本身(目录像文件一样显示),而不显示其下的文件(directory)
-e 输出时间的全部信息,而不是输出简略信息。
-f  对输出的文件不排序(默认的)
-F p根据文件目录信息给予附加的数据结构(*-->可执行文件;/-->代表目录;=-->代表socket文件;|-->FIFO文件;@-->符号链接)
-h  将文件容量以GB、KB、M等形式列出来-----> db -sh(显示文件的大小)
-i   输出文件的 i 节点的索引信息。
-k  以 k 字节的形式表示文件的大小。
-  列出文件的详细信息(文件的属性和权限等)。
-m 横向输出文件名,并以“,”作分格符。
-n  用数字的 UID,GID 代替名称。
-o  显示文件的除组信息外的详细信息(同 U)
-r   将结果反向输出(reverse)
-R 连同子目录的内容一并列出来,该目录下的所有文件都会显示出来
-S 以文件的容量排序(size)
-t   按时间排序

补充:-L 列出链接文件而不是链接到的文件

小技巧:ll等价与ls -l 引申------>bash shell的alias(别名)功能

功能分类:排序输出等

后续:文件的过滤(涉及正则表达式)

思考:问什么我们可以在任意用户任意目录执行命令(eg:/bin/ls命令)?

解答:类比Java中要设置java和javac的命令一样,需要将命令加到系统的环境变量路径中!

执行逻辑:系统首先会从当前目录查找该命令,如果没有则从系统路径变量(PATH)中去查找!

需求1:在不同的用户下列出查询的路径

测试:echo(显示、打印出) $PATH(大写)------>结果由一堆目录组成

说明:二者目录有区别但是二者都有共性的地方(PATH下都有/bin目录),这也是思考的回答!

思考:如果PATH中有多个相同的命令(目录结构不一样),哪个命令先执行------>顺序(谁先被查询)

需求2:上面我们知道某些命令的目录不在PATH中,但是我们还想执行此条命令怎么办?

首先先进行判断

如果权限允许:通过绝对路径去执行该命令

权限不允许:则启用超级用户即可---(超级用户root--->visudo--->99行编辑相应的配置文件--->切换普通用户去执行 sudo命令)

################
####文件权限####
################

二 权限信息

(1)引入

执行:touch 4.c ------> ls -al------>展现如下的信息:

Linux基础命令(四)

################
####文件权限和属性####
################

####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    ##目录(常用)
c    ##字符设备
s    ##套接字
p    ##管道
b    ##快设备
l     ##连接(软--->常用)

2."rw-r--r--":文件读写权限
rw-  |  r--  |   r--
 *        $      @

说明:*所有人的权限------$所有组对其操作的权限aaa@qq.com其他人的权限

3."1(number)":连接数的含义---->好好体会

文件:文件内容被系统记录次数
目录目录中(限定)文件属性的字节数

4."root":文件所有人(并不一定最初由其创建就属于他,理解为房子的买卖,易主了)

5."root":文件所有组

6."46":文件内容的大小(默认单位是B)

7."Oct  1 05:03":文件最后一次被修改的时间内容变化

8."filename":文件名字

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)

说明:一旦属性改变,因为权限是相对于文件(目录)所有者和所属组而言,属性的改变结果是------>拥有权限去操作文件或目录

测试:------>监控命令:watch -n 1 ls -lR /mnt

(2)改变文件普通权限

权限:rw-r--r--

u:文件所有人对文件可以读写(前三个)
g:文件组成员对文件可读(中间三个含义)
o:其他人对文件可读---->好好体会(其他人相对于该用户组的人不是相对于该用户的人)
u优先匹配,g次优先,o当{u、g}不匹配时匹配

说明:这里暂时不讨论文件和目录的权限意义仅讨论权限的修改

细化: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)

需求:文件的权限改变成所有人所属组其他人都是只读

测试:chmod 444 filename

  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:ugr以逗号隔开

文件所属组概念:是以文件所属用户所在的用户组(主)

理解上:覆盖原来的权限

注意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用户和用户组其他组全部进行相应的修改

(3)目录和文件权限的意义

引入:上面做了那么多操作,我们已经初步掌握了修改文件属性和权限的操作,但是对于文件的和目录的rwx你真正了解的含义吗?而文件和目录的权限又有哪些区别呢?

两步走:权限对文件的重要性以及权限对目录的重要性

1)权限对文件的重要性

   文件的种类:一般文本文件、数据库的文件、二进制的可执行文件(脚本文件--程序)等

   我们知道文件存在的目的:主要是存储数据的,存储数据后总得查看(正确不),有时是不是还得修改,有的文件还需要被系统执行。

 注意:系统肯定会尽最大的努力保护系统的稳定性,即对于自定义的文件总是限制其执行权限,以免导致文件执行导致系统崩溃,这也是umask系统对文件权限限制的由来(后续再讲)!

 r(read):可以读取此文件的内容------>常用命令{cat,less,more,head,tail等}------前提:得进入文件所在的目录中

 w(write):对文件内容的操作(编辑、写入、添加、修改)----->注意:不包含删除文件----->着眼点(文件的内容)

 x(execute):该文件具有能被系统执行的权限

 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)系统默认权限的设定

需求上分析:从系统安全角度来说,开放权力越少,系统安全性越高,所以系统设定新建文件或目录会默认减掉一些权限

说明:不同的用户登陆下默认的权限不同

(1)超级用户(本来权限比较大,系统会制约的狠些):
umask值默认是0022(减去的权限),创建的目录的权限(755),创建文件的权限[644,默认满权限是(666)]

(2)普通用户(本来权限比较小,系统会制约的一般):
umask值默认是0002(减去的权限),创建的目录的权限(775),创建文件的权限[664,默认满权限是(666)]

共性:系统分配文件的默认满权限是666(剪掉了执行权,最大限度的保证了系统的安全性!)

执行流程:先判断类型(是文件还是目录)----->再根据用户的级别(一般还是超级)减去相应的umask----->得到文件或目录的最终权限

umask含义:用户默认减去的权限(umask的注意事项!!!!!!!)

需求1:查看用户的umask的系统默认剪掉的权限------>umask

需求2:临时设定(更改)用户的umask ------>umask 077------>特点:只当前shell中生效

需求3:永久设定方式(不建议)------>修改配置文件------>vim /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

注意:在root下修改配置文件

(5)特殊权限

引入:我们发现 /tmp 以及 /usr/bin/passwd的权限有些奇怪

测试1:ls -ld /tmp

     结果:drwxrwxrwt. 16 root root 4096 Jul 30 03:24 /tmp--------------------------------------------->目录上

测试2:ls -l /usr/bin/passwd

     结果:-rwsr-xr-x. 1 root root 27832 Jan 30  2014 /usr/bin/passwd------------------------------->文件上

思考:不是只有r、w、x吗?这些特殊权限的(s、t)的含义是什么?

明确:这两个权限的意义与系统的帐号以及系统的进程有关,后续会讨论!

情景模拟:Linux系统下所有的账户的密码都记录在/etc/passwd这个文件中------1>这个文件的权限是 -r---------1 root root------2>意思:这个文件仅有root可读且仅有root用户可以强制写入------3>思考一般账户能否自行修改自己的密码

发现:当然可以修改密码------>思考:内在机理呢?为什么没有冲突呢?

原因:SUID的功能------>引出:什么是SUID?

概念:当s标志出现文件(限定1)所有者(限定2)的x权限中(限定3)时,是冒险位,此时就被称为Set UID,简称SUID的特殊权限!

疑问:SUID权限对于一个文件特殊功能是什么?基本上SUID有这样的限制功能

**************************************************************************************************

(1)SUID权限仅对二进制程序(具有s属性的命令)有效;------>什么叫做二进制程序?

(2)执行者对于该程序需要x的可执行权限;---->才能开启此命令(注意:暂时还不能用此命令干活)

(3)本权限(SUID)仅在执行过程中(run-time)生效;---->什么叫做执行过程中?

(4)执行者具有该程序所有者(owner----user)的权限(类似于继承权限)<------具备的功能

**************************************************************************************************

案例分析(来自上面的情景模拟):命令------>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
知识点:suid=4
chmod 4xxx file

----------------------

SGID的概念:当s标示在用户组的x使则称之为Set GID,简称SGID#强制位

特点:针对文件和目录来设置

(1)针对文件功能如下

    1)SGID属性对二进制程序(具有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)用户若对此目录具有rw的权限(6),该用户能够进入此目录;------>前提是查看目录的权限来判断

    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

作用:指定特殊用户对特殊文件有特殊权限,涉及到粘贴位


drwxrwx---+ 2 root root 17 Jul 18 01:39 /westos/
      ^
   表示/westos目录时有权限列表

getfacl  /westos/

# file: westos/        ##文件名称
# owner: root        ##文件所有人
# group: root        ##文件所有组
user::rwx        ##拥有者权限
user:student:rwx    ##特殊用户权限
group::---        ##组权限
mask::rwx        ##权限掩码
other::---        ##其他*限

注意:当文件上有权限列表时,ls -l 能看到的权限是假的


2设定acl列表

###设定##
setfacl -m <u|g>:<username|groupname>:权限    文件|目录
-m    #设定
u    #用户
g    #组


##删除列表中的用户或者组####
setfacl -x <u|g>:<username|groupname>    文件|目录

##关闭列表
setfacl -b 文件|目录    

###acl mask值###

1.mask    权限掩码
mask用来标实能够赋予用户最大权限
当用chmod改变文件普通权限时可能会被破坏
修复

setfacl -m student:rwx 文件名称

####acl 默认权限######

acl:access control list(访问控制列表)

需求1:某个"目录"对于student可写,并且目录中新建的子目录对student也可写,就要设定默认默认权限

注意:默认权限只对目录中新建立的(文件或者目录)生效,对已经建立的文件无效,对于"目录本身"也无效

setfacl -m d:u:student:rwx  /westos(表示root用户下特定目录,当studnet用户时给与它赋予的VIP权限)

需求2:关闭对某个用户的VIP

setfacl -b file(root登陆下修改)

注意:必须是在root用户的授权下

需求3:查看访问修改后的列表(root下)

getfacl 文件名(前提是设置了!)

-----------------------------------------------------------------

####6.特殊权限####
1.suid    ##冒险位

说明:针对二进制可执行文件
特点:文件内记录的程序产生的进程的所有人为文件所有人和进程发起人身份无关

需求1:
设定方式:
chmod u+s file
suid=4
chmod 4xxx file

2.sgid    ##强制位

(1)对文件:

特点:只针对二进制可执行文件,任何人运行二进制文件程序时程序产生的进程的所有组都是文件的所有组和程序发起人组的身份无关

(2)对目录:

当目录有sgid权限后,目录中新建的所有文件的所有组,都自动归属到目录的所有组之中,和文件建立者所在的组无关实验
设定方式:

chmod g+s file|dir
sgid=2
chmod 2xxx file|dir
    
3.sticky    ##粘制位
t权限:
特点:只针对与目录,当一个目录上有t权限,那么目录中的文件只能被文件的拥有者删除,即使文件所属的目录是满权限!

设定方式:
chmod  o+t direcotry
t=1
chmod 1777 direcotry

###end###

相关标签: 权限 属性