Bootstrap

linux-权限管理基本命令

文件的权限信息的表示格式和含义

drwxr-xr-x. 第一个字符表示的文件类型:

  • d:目录文件

  • l:链接文件

  • b:块设备文件

  • s:套接口文件

  • c:字符设备文件

  • p:管道文件,特殊少见的设备

  • -: 表示普通文件

  • w:写

  • r: 读

  • x:执行

更改文件或目录权限命令:chmod

①、命令名称:chmod
②、英文原意:change the permissions mode of a file
③、命令所在路径:/bin/chmod
④、执行权限:所有用户
⑤、功能描述:改变文件或目录权限
⑥、语法: chmod
        【{ugoa}{±=}{rwx}】【文件或目录】
        【mode=421】【文件或目录】
         -R 递归修改
    注意: 不是每一个Linux用户都有权限更改某个文件或目录权限,能更改文件或目录权限的只有两种用户
  ①、文件的所有者。我们通过ls命令查看某个文件的详细信息,可以看到该文件的所有者。
  ②、root用户,这不用多说,root用户是linux系统权限最大的用户。别人不能干的事,root用户都能干。
  对于上面的语法 chmod 【{ugoa}{±=}{rwx}】【文件或目录】,我们要知道ugoa分别是:u:表示所有者,g:表示所属组,o:表示其他人,a:表示所有人。
  对于上面的语法 chmod 【{ugoa}{±=}{rwx}】【文件或目录】,我们要知道ugoa分别是:u:表示所有者,g:表示所属组,o:表示其他人,a:表示所有人。
而rwx表示的意思如下:
在这里插入图片描述  对于【mode=421】【文件或目录】,这是我们将权限用数字表示,其中 r 表示4,w表示2,x表示1,分别是2的0次方,1次方,2次方。那么我们可以这样理解:具有 rwx 权限的数字就是 7,具有 rw- 权限的数字是 6,具有 r-- 权限的数字是 4。
我们常用的权限的数字模式又这几种:

  • 644:这是文件的基本权限,代表所有者拥有读、写权限,而所属组和其他人拥有只读权限。rw-r–r–

  • 755:这是文件的执行权限和目录的基本权限,代表所有者拥有读、写和执行权限,而所属组和其他人拥有读和执行权限。rwxr-xr-x

  • 777:这是最大权限。在实际的生产服务器中,要尽力避免给文件或目录赋予这样的权限,这会造成一定的安全隐患。rwxrwxrwx

    范例1: 我们赋予 tmp 目录下的 tmp.log 所有者 x 的权限;赋予 所属组 w 权限,其他人 w 权限。也就是说我们要给 tmp.log赋予的文件权限是 rwxrw-rw-,用数字表示是766。
    在这里插入图片描述 我们还可以递归赋予权限,也就是加上 -R 参数给指定目录下的所有文件或目录赋予指定权限。
    在这里插入图片描述
    注意知识点:对权限的正确认识,分两种对象,文件和目录
    文件:

  • r,读:对文件的内容有读的权限,对应的命令:cat,more,less,head,tail等

  • w,写:可以修改文的内容,对应命令vi,vim,echo,注意对文件的写权限不能删除文件本身,要删除文件必须拥有文件
    的父文件夹的写权限

  • x,执行:表示拥有了执行的这个文件的权限,但是不是说有这个权限,文件就可以执行,文件可以执行否,前提拥有r的权限(普通用户,root不需要),但是有了权限的前提下,还必须是这个文件里的内容是正确的可以执行的代码
    目录:

  • r,读:对目录,是可以查看文件夹里的内容,对应命令是ls

  • w,写:可以修改文件里的内容,也就是可以复制,删除,新建,移动文件夹里的子目录和文件,对应的命令cp,touch,
    mv,rm…命令

  • x,执行:文件夹显示是不能运行的,对文件夹设置执行权限,表示可以进入到文件夹里边去,对应的命令cd
    总结:我们要删除一个文件,不是对文件本身有w权限就可以,必须要拥有这个文件的父文件夹具有w的权限才可以!

二、改变文件或目录所有者命令:chown

①、命令名称:chown
②、英文原意:change file ownership
③、命令所在路径:/bin/chown
④、执行权限:所有用户
⑤、功能描述:改变文件或目录的所有者
⑥、语法: chown 【用户】【文件或目录】
注意:能更改文件或目录的所有者用户是 root,所以首先要登录到root用户中,才可开始操作改更
  例:这里我们通过useradd【用户名】命令创建用户,然后通过passwd【用户名】输入密码,这两个命令后面,我们通过这两个命令创建 vae 用户
  
    创建用户:user1 ,密码:xiong,再把 aaa目录的所有者设为user1
在这里插入图片描述
  chown user1 aaa
在这里插入图片描述

三、改变文件或目录所属组命令:chgrp

  ①、命令名称:chgrp
  ②、英文原意:change file group ownership
  ③、命令所在路径:/bin/chown
  ④、执行权限:所有用户
  ⑤、功能描述:改变文件或目录的所属组
  ⑥、语法: chgrp【用户组】【文件或目录】
注意:能更改文件或目录的所有者用户是 root
例:由于创建用户时,会自动创建同名的用户组,所以在此把它设为user1组
在这里插入图片描述

四、显示、设置文件的缺省(默认)权限命令:umask

  我们手动创建的文件夹默认的权限为755,即其它用户和组没有写权限,实际开发中很少很少改umask,但我为了学习理解它,我在这会改,折腾一下。
  ①、命令名称:umask
  ②、英文原意:the user file-creation mask
  ③、命令所在路径:shell 内置命令
  ④、执行权限:所有用户
  ⑤、功能描述:显示、设置文件的缺省权限
  ⑥、语法: umask 【-S】
        -S 以rwx形式显示新建文件的缺省权限
注意:可能大家不太明白这个命令的意思,我们分别执行umask和 umask -S ,如下:
在这里插入图片描述
  其中umask 执行显示结果是 0022,第一个0表示特殊权限,后面我们会单独进行讲解有哪几种特殊权限。022表示权限的掩码值,我们用7 7 7 减去 0 2 2得到755(这里的减,不是单纯的对应位置上的数相减,一会儿我们详细说说掩码值是怎么转成权限值的),表示的就是下面通过加上-S输出的rwxr-xr-x,这个值用数字表示就是755.

  注意这里创建目录和创建一个文件会有点不一样,来验证一下创建文件:
在这里插入图片描述
  我们发现使用touch命令创建了一个文件a.txt,然后发现权限并不是rwxr-xr-x(755),而是rw-r–r–(644)。对比发现少了三个x,也就是少了可执行权限。这是为什么呢?
  这是因为在Linux系统中,所有新创建的文件都是没有可执行权限的。这是出于Linux系统的一种自我保护,因为类似的病毒木马程序都是具有可执行权限的。所以在Linux系统中,新创建的文件是没有可执行权限的。对于新建的文件最高的权限666

  设置默认权限
比如我们想将新创建的文件权限设置为rwxr-xr–,也就是754。
我们用777减去754得到023。也就是通过执行 umask 023 来完成默认权限设置。(文件不一样哦,注意一下)
在这里插入图片描述
掩码值的计算方法:

  • 1、将默认最大权限(目录777,文件666)和umask值都转换为2进制
  • 2、对umask取反
  • 3、将默认权限和umask取反后的值做与运算
  • 4、将得到的二进制值再转换8进制,即为权限,
例1: umask 为022
6  6  6            umask   0  2   2
110 110 110       000 010  010             # 转成二进制
                           111 101  101    # umask取反的值
110 110 110    与                         # 第二步,默认权限和umask取反后的值做与运算
111 101 101                            # umask取反的值
110 100 100                          #与运算后,二进制结果
6   4   4                                   #转成8进制

  

权限进阶

前面我们讲过基础的权限命令,chmod,chown,chgrp,umask命令,通过这些命令我们能够对目录或文件进行最基本的权限设置,但是在实际的应用中还有很多是这些命令解决不了的权限设置问题,所以,我们这里进一步地对linux的权限管理进行讲解!

一、Linux权限管理的ACL权限

  • 1、什么是 ACL 权限?
    ACL的全称是 Access Control List (访问控制列表) ,一个针对文件/目录的访问控制列表。它在UGO权限管理的基础上为文件系统提供一个额外的、更灵活的权限管理机制。ACL允许你给任何的用户或用户组设置任何文件/目录的访问权限。

  • 2、ACL有什么用
    既然是作为UGO权限管理的补充,ACL自然要有UGO办不到或者很难办到的本事,例如:
    可以针对用户来设置权限
    可以针对用户组来设置权限
    子文件/目录继承父目录的acl权限

  • 3、检查是否支持ACL
    ACL需要Linux内核和文件系统的配合才能工作,当前大多数Linux发行版本默认都是支持的。
    CentOS7.X创建的xfs文件系统默认内置支持ACL功能!
    CentOS7.X之前版本,手工创建的ext4文件系统可能没有开ACL功能。如果没有需手动重新挂载开启,但一般情况都是开着的。

  CentOS7.X之前版本,最好还是查看一下,我们看某个文件/目录否支持 ACL 权限,首先要看文件所在的分区是否支持 ACL 权限。
  ①、查看当前系统有哪些分区:df -h

  ②、查看指定分区详细文件信息:dumpe2fs -h 分区路径 (只针对于CentOS7.X之前版本,xfs文件系统不支持这个命令了,xfs里用xfs_info 分区路径,查看分区的详细信息)
      看实例:给三个用户user1,user2,user3添加到用户组tg(图片中是g1),让tg/g1生效于a目录,再赋于a目录770权限,即其它用户对a没有任何权限,突然有一天,来了个实习生,但又不能让他加了用户组,又要让他可以有对a有读执行权限,这就要用到ACL
在这里插入图片描述
  单独位shixi赋予acl权限rx:

$ cd /a
-bash: cd: /a: Permission denied   #刚创建的shixi用户没有任何权限,所以连a目录进都进不去
su -    #回到root用户下,也只有root或root组中的用户(也不会搞很多这样的用户)才能给其它用户设置属性
setfacl -m u:shixi:rx /a  
su - shixi                 #进入shixi用户,它现在可以进入/a中了。
$cd /a

在这里插入图片描述
5、查看 ACL 权限:getfacl 文件名

//acl权限具体是什么,用getfacl查看:
getfacl /a

在这里插入图片描述
6、最大有效权限 mask(一般不去改它)
   ACL 权限存在一个最大有效权限的概念,我们给用户或用户组设定 ACL 权限其实并不是真正我们设定的权限,
是与 mask 的权限“相与”之后的权限才是用户的真正权限,一般默认mask权限都是rwx, 与我们所设定的权限相与就是我们设定的权限。
这个值是可以修改的:**

setfacl -m m:权限 文件名

删除 ACL 权限

  • ①、删除指定用户的 ACL 权限

​    setfacl -x u:用户名 文件名

  • ②、删除指定用户组的 ACL 权限

​    setfacl -x g:组名 文件名

  • ③、删除文件的所有 ACL 权限

​    setfacl -b 文件名

递归 ACL 权限

​    通过加上选项 -R 递归设定文件的 ACL 权限,所有的子目录和子文件也会拥有相同的 ACL 权限。当然了,新建的文件或子目录是没有ACL权限的。

  setfacl -m u:用户名:权限 -R 文件名
在这里插入图片描述

   默认 ACL 权限

​    如果给父目录设定了默认的 ACL 权限,那么父目录中所有新建的子文件会继承父目录的 ACL 权限。

​    setfacl -m d:u:用户名:权限 文件名

二、sudo命令的使用

    简单的说,sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 才能执行的操作,而不需要知道 root 的密码。
    严谨些说,sudo 允许一个已授权用户以超级用户或者其它用户的角色运行一个命令。当然,能做什么不能做什么都是通过安全策略来指定的。默认的安全策略记录在 /etc/sudoers 文件中。

1、编辑配置文件命令:visudo
  注意:编辑sudo的配置文件/etc/sudoers是一般不要直接使用vi(vi /etc/sudoers)去编辑,因为sudoers配置有一定的语法,直接用vi编辑保存系统不会检查语法,如有错也保存了可能导致无法使用sudo工具,最好使用visudo命令去配置。虽然visudo也是调用vi去编辑,但是保存时会进行语法检查,有错会有提示。

2、配置文件/etc/sudoers的具体配置
  root ALL=(ALL) ALL
  #用户名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)(注意:这里写的越具体,授权就越安全)
  %wheel ALL=(ALL) ALL
  #%组名 被管理主机的地址=(可使用的身份) 授权命令(绝对路径)(注意:这里写的越具体,授权就越安全)

  可使用的身份:(ALL)代表可以切换成任意身份(用户)。不写默认是root

举例,授权给班长( bz)用户可以添加新账号,和修改普通用户的密码权限:
 bz ALL=/usr/sbin/useradd   //赋予 bz添加用户权限.命令必须写入绝对路径
 bz ALL=/usr/bin/passwd   //赋予改密码权限,只是这样做要遭! 必须取消对 root 的密码修改
 bz ALL=/usr/bin/passwd [A-Za-z]*, !/usr/bin/passwd “”, !/usr/bin/passwd root  //注意:逗号后必须有空格

#下面是例子的代码过程
useradd bz
passwd bz    //设置密码
su - bz
$useradd student1
//useradd: Permission denied. 刚开始bz没用添加用户权限
su -   //回到root
visudo                   // visudo中间没有空格,不是vi sudo
bz ALL=/usr/sbin/useradd   //上面的which查到了useradd命令所在位置

在这里插入图片描述

su - bz
sudo -l      //查看 bz拥有的权限
#User bz may run the following commands on client2:
#    (root) /usr/sbin/useradd
sudo useradd user1     //可以添加用户了,但还是权限比较大,如参数-g,可以赋初组,我们可以限定一个参数
su           //回到root
visudo       //最后一行的代码修改如下,这样限定了只能带-c加注释创建用户,不带-c都不行呀。
bz ALL=/usr/sbin/useradd -c [a-zA-Z0-9]*    
su - bz
sudo /usr/sbin/useradd -c "xiongshaowen" user1   //会成功创建用户
sudo /usr/sbin/useradd  user1    //不允许这样的,创建失败

3、普通用户查看自己能执行的sudo命令:sudo -l,再为bz赋密码权限,但不可修改root密码
  用户 bz 可以在 CentOS7 上运行以下命令:

su - bz
sudo -l
su             //回到root用户
visudo         //设置bz用户的密码权限
bz ALL=/usr/bin/passwd
//赋予改密码权限,只是这样做要遭! 必须取消对 root 的密码修改
bz ALL=/usr/bin/passwd  [A-Za-z]*,  !/usr/bin/passwd "",  !/usr/bin/passwd root
//注意:逗号后必须有空格,上面的代码含义:不允许空,不允许修改root密码
su - bz
passwd user1     //可以修改user1密码了,
passwd root           //不允许修改root的密码

4、普通用户执行自己能执行的sudo命令

su - bz
sudo useradd -c "xxx" 用户名
;