用户、组和文件权限解析_学习笔记

时间:2017.11.16

作者:李强

参考:man,info,magedu讲义

声明:以下英文纯属个人翻译,英文B级,欢迎纠正,以下内容纯属个人理解,并没有对错,只是参考,盗版不纠,才能有限,希望不误人子弟为好。


1、使用目的与场景


用于使用在用户和组和权限关系变动的情况下,比如要添加用户添加组,分配其不同的权限和对文件操作的权限


2、官方说明

  

3、写在前面

首先是明白用户和组和权限的关系,拿一个公司的架构来说,有用户分普通用户和VIP用户,就是员工和老板的关系,然后就是用户的分组,一般来说自己管自己然后归老板管,就是user和root的关系,我们默认自己管自己就是你的组就是你自己,如果你们哪天人多了,那么你成组长,你是扫地组的组长,下面有好几个扫地的归你管,你就是你这个组的管理员,你组里得成员和你一样都能获得扫地的权利了。这就是用户和组的关系。针对你的东西可以分成3个角色,(owner,group,other)就是你,你扫地组的,其他人(老板不受你限制),这3个角色可以对你的东西进行公什么样的操作有3个(read,write,execute)就是看,修改,用。

那么问题来了,你是组长你能干什么呢,你不能去老板的办公室房间,或者动老板的文件除非老板授权你去做,要不然你就是卧底,就是说普通用户不能管理老板的东西,除非老板给你授权。正常情况下,老板的东西所有者为root,所属组为root,其他没有权限。你是扫地组组长假设是S,那么你的东西所有者就是S,所属组为S,其他部门的没权限看你。老板想要看你的拿你的东西,你不能不给,除非你扔了跑路。那么2个房间我们定好了你的房间Sroom,老板的房间Broom,你房间的使用权是老板给你的。钥匙是x权限,如果没钥匙你们只能在门外并不能房间里的东西做任何操作。如果你有r去权限,说明你能够知道房间里有哪些东西(ls Broom),不至于摸瞎,如果你有w权限那么你就可以为所欲为了,房子你都给拆了(rm -r Broom)。

场景1:老板放了个文件在你的房间里你只能看不能删,比如你老情人的照片,你怎么办。

  首先因为这里是你的房间Sroom,你有rwx权限,所以你能看到老板放了个m文件,所有者为老板R,你只能看着你老情人抱着你老板的照片,你虽然不能把照片换成你和老情人的照片因为老板上锁了你打不开你不能给自己加w去权限,你有三种选择:

1、rm 你可以大胆的把照片给扔了(rm m)。因为这个房间你有w权限。即使这个时候你的眼睛被蒙住了(chmod u-r Sroom),你还是靠感觉在里面摸,找到照片(除非你不记得你老情人长啥样,这就扎心了rm m 你虽然看不到房间有什么,但是你知道这里面有什么也行)给扔了

2、cp 而且你还可以造假,你虽然不能把这个照片给换了,但是你可以读,所以你可以(cp)拍个照片,然后去把你的照片换上然后把你老板的照片扔了换成你的照片(cp m s;cp s m -f)。虽然你老板仔细一看就知道你小子搞的假的(ll m) ,但是你看着舒服不是。

3、mv 你还可以把照片给藏起来(mv m nmp),你拿块布给它盖着眼不见为净。

如果这个时候你们老板摆明了气死你,把你房间的也给锁了,你只有rx权限,你就只能站在门外看着你老情人的份。这个时候你可以选择跑路(logout),然后一辈子不回来,或者去拿个×××把你的房间炸了(找hacker给黑了,不太好,国家管制)


场景2:时光荏苒,你们公司壮大,你们组陆续来了a,b,c三位小姑娘(为啥不是男的,因为iamboy),结果就是她们都属于你们组,但是她们使用同一个文件出了问题,她把她修改的内容删了,她把她创建的文件给删了,a看了b的日记本。

人多了就不能用other了,所以针对a,b,c 我们需要设置不同的权限,需要用到新的策略(acl),对于项目文件program中的1个list文件,list文件是你的。

要求abc对这个文件夹program登录后就获取program组的权限(sgid),其他人没有权限。

她们可以在这里建她们自己的文件但是每个人不能删除不是自己的文件(sticky)

对于这个list文件每个人只能去补充(chattr)。

她们在这个program下默认创建的文件权限是别人只能看。


因为系统配置影响着所有的用户,所以一般不建议直接改动配置文件,而是修改的命令,如有必要可以通过一些特定的命令去修改,然后命令去检查提醒你各个配置文件的语法和依赖性是否正确。


vipw 安全修改/etc/passwd文件
vipw -s 安全修改/etc/shadow文件
vigr  安全修改/etc/group文件
vigr -s  安全修改/etc/gshadow文件
pwck  默认检查/etc/passwd /etc/shadow
grpck 默认检查/etc/group /etc/gshadow 

vipw 和vigr 如果带上-g,-p,都可以编辑/etc/group和/etc/passwd,不加就字面意思vipw编辑/etc/passwd ,vigr编辑/etc/group,但是加上-s,就是各自编辑自己的密码文件


对文件进行编辑时使用这些命令可以有语法及依赖性检查。还是相当于直接手动改文件,只是保证了你没有改变这个

文件里面内容的格式,但是相关的文件并没有一次改完,所以还是会用命令靠谱些。


4、修改文件及涉及的环境变量

    /etc/passwd

    /etc/shadow

    /etc/group

    /etc/gshadow

    /etc/default/useradd

    /etc/defult/useradd-

    /etc/skel/*

    /etc/login.defs

    $USER,


5、用法

1、用户

云盘管理,这个目录下有100个用户,对每个用户有每个用户的家目录

不同之间没有好像访问的权利,

1、可以共享,就是这个目录的权限放开,

2、给特定用户访问权限就是云盘的密码连接,你输入密码就可以访问,

3、当然你可以指定特殊账号可以进行访问。给其目录新加一个用户的访问权。

1.1、useradd

sarah:x:505:506::/home/sarah:/sbin/nologin
/etc/passwd保存用户信息的文件格式
NAME
  useradd - create a new user or update default new user information

SYNOPSIS
  useradd [options] LOGIN
  useradd -D
  useradd -D [options]
-p:添加passwd
-e:用户有效期
-f:密码有效期
-u:添加uid
-g:为用户添加gid
-G:添加用户的附属组
-c:添加用户的解释comment
-d:添加的用户的家目录
-s:添加用户的shell类型
-D:用户的默认设置查看 /etc/default/useradd|useradd-
-l:不将用户加入到lastlog和faillog数据库
-k:重新为用户执行skel目录,不用默认的/etc/skel(包含系统创建用户的基本设置)
-K:  --key KEY=VALUE  e.g.: -K UID_MIN=100 -K UID_MAX=499
取代/etc/login.defs中默认值(UID_MIN,UID_MAX,UMASK,PASS_MAX_DAYS and others).
-m:创建家目录
-M:不创建家目录
-N:不创建和用户名称一样的用户组
-r:创建系统用户
-U:允许创建重复uid的用户,不检查uid的唯一性
-D -b --base-dir BASE_DIR
-D -e --expiredate EXPIRE_DATE 账号什么时候会无效
-D -f --inactive INACTIVE  密码过期多久用户会失效,被锁定
-D -g --gid GROUP 
-D -s --shell SHELL 新用户的shell类型
以上-D修改/etc/default/useradd.此文件内容
useradd 不能给NIS 或者LDAP 组添加用户
username 最大长度不能超过32个字符。

1.2、usermod

NAME
       usermod - modify a user account

SYNOPSIS
       usermod [options] LOGIN
-l:给用户改名字       
-u:修改用户的uid
-o:不检查uid的唯一性,与-u一起使用,但是不建议,会致管理混乱
-g:强制设置一个组为用户的新主组
-G: 修改用户的附属组,会覆盖
-a:添加附加组到用户不会清空原有的附加组,配合-G使用
-c:修改用户的comment
-d:给用户指定新的家目录,新的家目录不会自动创建需要手动建,而且原家目录也不会删除,
相当于cp不加-a,最好配合-m使用,保留原家目录信息并移动。
-s:修改用户的shell
-m:移动用户的家目录到新的目录和-d一起使用
-L:锁定用户。在/etc/shadow的用户密码前加!
-U:解锁用户,去掉在/etc/shadow的用户密码前的!
-p:修改密码不建议使用,因为这个密码是在history list中是可见的,密码必须是crypt(3)才行,
加密格式的密码。存在即合理会有使用的条件,目前不晓得。
-Z:--selinux-user SEUSER 用于user登录新的SELINUX user,没学到SELINUX呢

1.3、userdel

NAME
       userdel - delete a user account and related files

SYNOPSIS
       userdel [options] LOGIN
       
默认就是删除,家目录和邮箱什么的并不会删除
-f:强制删除
-r:删除家目录和邮件
-R, --root CHROOT_DIR  都是没学到的概念呢
-Z:--selinux-user SEUSER 用于user登录新的SELINUX user,没学到SELINUX呢

CAVEATS
1)、如果存在属于此帐户的运行进程, userdel 将不允许您删除帐户。在这种情况下, 
您可能必须杀死这些进程或锁定user′s的密码或帐户,在去删除帐户.
-f选项可以强制删除此帐户,不管谁在使用账户呢,并且删除家目录和邮箱。
但是我们应该手动检查所有文件系统, 以确保此用户没有任何文件保留。
我们并不能删除 nis 客户端上的任何 nis 属性。必须在 NIS 服务器上执行此操作。
2)、如果 USERGROUPS_ENAB=yes在/etc/login.defs文件中.userdel将删除和用户同名的组。
为了避免passwd和组数据库中的不一致,userdel将检查此组是否用作其他用户的主要组, 
如果有发出警告并不会删除这个组。-f选项可以强制删除此组。

1.4、passwd

NAME
 passwd - update user’s authentication tokens

SYNOPSIS
 passwd  [-k]  [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] 
           [-w warndays] [-i inactivedays] [-S] [--stdin] [username]      
DESCRIPTION
 passwd 实用程序用于更新用户的身份验证令牌。这项任务是通过调用 Linux-PAM
 和 Libuser API 实现的。 本质上, 它将自身初始化为"passwd" 服务与 Linux-PAM, 
 并利用配置的密码模块进行身份验证, 然后更新用户的密码。
       
OPTIONS
-k:针对过期的密码,解除密码的过期属性,让用户继续使用这个密码
-l:只能被root使用,锁定指定的用户,在密码加密的字段前加上!
--stdin:让passwd命令能从STDIN标准输入中读取新密码
-u:和-l相反,/etc/shadow文件中,passwd -u 并不能把空密码的!!去掉,
    除非加-f,去掉保护。用户就可以空密码登录
-d:删除账号的密码,账号将变成空口令登录
-e:快速让密码过期,下次登录必须修改密码,修改date of last password change字段为0
-n:密码存活最小多少天
-x:密码存活最多多少天
-m:提前多少天提醒用户密码过期
-i:密码过期后,账号还有多少天会被锁定
-S:将输出有关给定帐户的密码状态的简短信息,仅root可以使用

1.5、chage

NAME
   chage - change user password expiry information

SYNOPSIS
   chage [options] LOGIN
改变用户密码的时间信息
可以直接chage + 用户,会一步一步提示修改那个
也可以加上option单个选项进行修改
-d:最后一次修改密码的时间如果设置为0就是强制下次登录必须修改密码,
可以用具unix元年的s数,也可以用YYYY-MM-DD的格式
-E:用户到期时间可以用YYYY-MM-DD的格式.也可以是到1970年1月1日的格式
-I:密码过期后多少天用户被锁定
-m:最少要多少天改密码,0表示随时
-M:最多到多少天必须密码
-W:在密码到期提前多少天给用户提醒。
-l:显示用户的密码时间信息
修改的文件是/etc/shadow

1.8、chfn

NAME
   chfn - change your finger information

SYNOPSIS
   chfn [-f full-name] [-o office] ,
      RB [ -p office-phone] [-h home-phone] -u] [-v] [username]
就是来修改/etc/passwd中的comment字段
chfn直接执行会一步一步的让你填写内容
-f:
-o:
-p:
-h:

finger可以来查看用户的comment信息

1.9、chsh

NAME
    chsh - change your login shell

SYNOPSIS
    chsh [-s shell] [-l] [-u] [-v] [username]
就是来修改/etc/passwd中的shell字段
chsh直接执行也会提示你修改当前用户的shell
-s 指定shell
-l 显示/etc/shells有哪些shell

1.10、newusers

NAME
       newusers - update and create new users in batch

SYNOPSIS
       newusers [options] [file]

DESCRIPTION
   newusers命令读取文件(默认情况下是标准输入),并使用此信息更新一组现有用户或创建新用户
   每行与标准密码文件的格式相同 (参见 passwd (5)), 以下是内容格式:
       pw_name:pw_passwd:pw_uid:pw_gid:pw_gecos:pw_dir:pw_shell
 
 -c:--crypt-method METHOD为密码指定加密的方式DES, MD5, NONE, and SHA256 or SHA512
 -r:--system创建系统用户
 -s:--sha-rounds  加密的轮数默认就好
 -R:--root CHROOT_DIR  没学到的概念呢
 
 CAVEATS
   所输入的密码必须是符合密码策略规范的,而且必须是明文的
   但是通过此方式常见的用户,家目录的内容好像有问题,待查证

1.11、chpasswd

NAME
       chpasswd - update passwords in batch mode

SYNOPSIS
       chpasswd [options]

DESCRIPTION
     user_name:password
-c:--crypt-method METHOD 为密码指定加密的方式DES,MD5,NONE,and SHA256 or SHA512
-e:--encrypted 提供的密码以加密形式存在,这个就是说后面的密码需要用加密算法加密的。
-m:--md5 当提供的密码未加密时,使用 MD5 加密代替 DES
-s:--sha-rounds  加密的轮数默认就好
-R:--root CHROOT_DIR  没学到的概念呢

2、组

2.1、groupadd

NAME
       groupadd - create a new group

SYNOPSIS
       groupadd [options] group
       
-f, --force
    与-g一起使用时,如果指定的gid已经存在,则系统选择另一个(唯一的)gid分配给这个账户
-g, --gid GID     指定一个组id。
-K, --key KEY=VALUE -K多以多次使用取代/etc/login.defs defaults(GID_MIN,GID_MAX等等).
     例如:-K GID_MIN=100 -K GID_MAX=499 
-o, --non-unique 不检查guid唯一性,可以设置2个一样gid的组,为啥子要有这个选项呢?
     存在即道理,肯定有应用的地方
-p, --password PASSWORD  给组设置密码
-r, --system  创建一个系统组
-R, --root CHROOT_DIR 没学到的概念呢

2.2、groupmod

NAME
    groupmod - modify a group definition on the system

SYNOPSIS
    groupmod [options] GROUP
       
-n 修改组的名称。
-g 修改组id
-o, --non-unique 不检查guid唯一性,可以设置2个一样gid的组,为啥子要有这个选项呢?
     存在即道理,肯定有应用的地方
-p, --password PASSWORD  给组设置密码 
-R, --root CHROOT_DIR  没学到的概念呢

2.3、gpasswd

NAME
   gpasswd - administer /etc/group and /etc/gshadow

SYNOPSIS
   gpasswd [option] group
-a --add user 添加用户到组中
-d --delete user 从组里删除用户
-r --remove-passwd 删除密码
-R  --restrict 限制用户访问这个组,在/etc/gshadow中加上!,只允许组成员通过newgrp
              和密码加入到这个组中
-A  --administrators user,...  设置管理用户列表
-M --members user,.... 设置组成员列表

2.4、groupdel

NAME
       groupdel - delete a group

SYNOPSIS
       groupdel [options] GROUP
 
-R, --root CHROOT_DIR
如果有用户以此组作为主组那么是删除不掉这个组的必须要先用userdel删除用户,
如果此组不包含其他用户会一并被删除,如果还包含其他用户,然后再用groupdel删除组。
#e.g.
[root@centos6 ~]#gpasswd -a lq  user02
Adding user lq to group user02
[root@centos6 ~]#getent group user02  
user02:x:510:lq
[root@centos6 ~]#userdel -r user02
userdel: group user02 not removed because it has other members.
[root@centos6 ~]#getent passwd user02
[root@centos6 ~]#getent group  user02
user02:x:510:lq
[root@centos6 ~]#groupdel user02
[root@centos6 ~]#getent group  user02
[root@centos6 ~]#

2.5、groupmems

NAME
   groupmems - administer members of a user′s primary group

SYNOPSIS
   groupmems -a user_name | -d user_name | [-g group_name] | -l | -p
       
-a --add user_name 添加用户到组成员列表中,如果group不存在/etc/gshadow中,创建这个组
-d --delete user_name 从组的成员列表中删除用户,
-l 查看以此组作为附属组的用户有哪些
-g 更改
-p purge 清空所有用户
-R  --root CHROOT_DIR


2.6、newgrp

NAME
       newgrp - log in to a new group

SYNOPSIS
       newgrp [-] [group]
      
当用户通过group 临时切换主组之后,然后用newgrp不填参数就是切回默认的主组
用newgrp - 也会切回默认主组,但是当前工作环境不会变,例如当前工作目录不会变
#e.g.
[lq@centos6 ~]$id
uid=500(lq) gid=500(lq) groups=500(lq) 
[lq@centos6 ~]$cd /app
[lq@centos6 /app]$newgrp -
[lq@centos6 ~]$id
uid=500(lq) gid=500(lq) groups=500(lq),1027(user02)
[lq@centos6 ~]$newgrp user02
[lq@centos6 ~]$cd /app
[lq@centos6 /app]$newgrp
[lq@centos6 /app]$id
uid=500(lq) gid=500(lq) groups=500(lq),1027(user02)

newgrp临时切换当前用户的主组时,如果当前用户不属于这个组,而且这个组的密码是空,
那么拒绝切换,如果有密码输入密码即可临时切换到这个组中,不修改文件
#e.g.
[lq@centos6 ~]$id
uid=500(lq) gid=500(lq) groups=500(lq) 
[lq@centos6 ~]$newgrp user02
Password: 
Invalid password.
[lq@centos6 ~]$echo $?
1
#这里输出1说明密码错了
[lq@centos6 ~]$newgrp user02
Password: 
[lq@centos6 ~]$id
uid=500(lq) gid=1027(user02) groups=1027(user02),500(lq)
[lq@centos6 ~]$


3、信息查看

3.1、finger

NAME
     finger - user information lookup program

SYNOPSIS
     finger [-lmsp] [user ...] [user@host ...]

-l:默认格式
-m:
-s:
-p:

3.2、su

NAME
       su  - run a shell with substitute user and group
       IDs

SYNOPSIS
       su [OPTION]... [-] [USER [ARG]...]
       
       、

3.3、id 

NAME
     id - print real and effective user and group IDs

SYNOPSIS
     id [OPTION]... [USERNAME]
     
当不跟上用户名,默认查看当前运行进程的用户信息,从内存中读取,而不是从磁盘上。
-a  ignore, for compatibility with other versions
-Z, --context 仅打印当前用户的安全上下文,后面不加用户名
-g, --group 打印主组信息
-G, --groups 打印所有组的信息
-n, --name 配合-ugG使用,打印名称而不是id
-r, --real 打印磁盘的数据而不是当前内存的信息,配合-ugG使用
-u, --user 打印用户当前有效的id

  这里的-r 的概念不是很清楚,如果通过su 登录的用户,此时如果此时的-ru -u 的状态,

然后是通过tty终端登录的用户,如果此时更改了/etc/passwd 的uid,那么 -ru -u 的状态又是不一样了。

 id + user 确实是从磁盘去读取数据了。

 id -u  获取effective的id不知道是啥、

 id -ru 获取的real 的id不知道是啥。


3.4、groups user

NAME
       groups - print the groups a user is in

SYNOPSIS
       groups [OPTION]... [USERNAME]...

DESCRIPTION
       输出每个用户的组信息,如果用户没有指定,就打印当前进程的用户信息 
       (可能会不同如果组信息被更改)
       等价于 id -Gn 的执行结果,只不过在显示的格式可能有点区别

3.5、getent passwd|shadow|group|gshadow  user

NAME
       getent - get entries from Name Service Switch libraries

SYNOPSIS
       getent database [key ...]
我们这里只去获取用户和组的相关信息,其他的databas不管。      
用于便捷的获取用户的相关信息从4个相关文件里,需要注意的是shadow和gshadow需要管理员权限。
#e.g.
[user02@centos6 ~]$getent passwd user02
user02:x:10110:1027::/home/usre02:/bin/bash
[user02@centos6 ~]$getent group user02
user02:x:1027:lq
[user02@centos6 ~]$getent shadow user02
[user02@centos6 ~]$getent gshadow user02
[user02@centos6 ~]$su
Password: 
[root@centos6 /home/usre02]#getent shadow user02
user02:$6$I5w1LRuP$uWfpF--此处省略--ebboUZO5d6unqW2yUWNUjG4/:17486:0:99999:7:::
[root@centos6 /home/usre02]#getent gshadow user02
user02:$1$YdF.SGek$3AyX.VGHvSW5deMifvam3.::lq
[root@centos6 /home/usre02]#


4.文件权限:

x是执行权限

X是只对目录有进入权限,但是对文件没有execute权限。

如果目录下file1有x权限那么使用chmod -R a+X  dir1

就会将dir1下的file1的所有都设置x,判断因为本身有x,所以会认为可以给其他使用者x权限

这里要注意使用风险。

对目录,x是基本权限。

对执行脚本,只设置x,只能执行。无法查看和改写,写的太烂不好意思给人看,用就行

对root的权限有特殊性。

文件的权限有三种类型和设置方式,

4.1、ugo

文件权限的3个对象owner,group ,other ,ugo 所有者所属组其他

文件操作的权限readable,writable,executable,rwx 可读可写可执行

ll ,stat,getfacl可以看到文件的属性和权限信息

文件的权限有2种显示方式数字和符号

chmod u=rwx g=rwx o=rwx   操作符可以+/-/= 分别表示加上/去掉/等于 

chmod 4777

文件相关权限说明
对象 符号(权限) 数字(权限) 符号(权限) 数字(权限) u s(suid) 4 r 4 g s(sgid) 2 w 2 o t(sticky) 1 x 1 x 对于目录为基础权限,有了x权限才能进入目录下,执行rw,对于文件而言比较无危险属性,文件具有可执行的功能。文件中如果有脚本可以被执行 suid 执行bin的用户会获取类似这个bin所有者的权限,比如/usr/bin/passwd sgid 执行bin的用户会获取类似这个bin所属组的权限,对于目录设置sgid,此目录中的文件都会继承此目录的所有组。通常用于创建协同目录 sticky

具有写权限的目录通常用户可以删除该目录中的任何 文件,无论该文件的权限或拥有权.比如/tmp

在目录设置Sticky 位,只有文件的所有者或root可 以删除该文件 ,Sticky对文件无效。

#e.g.
[root@centos6 /app]#ll /usr/bin/passwd
-rwsr-xr-x. 1 root root 30768 Nov 24  2015 /usr/bin/passwd
[root@centos6 /app]#ll -d /tmp        
drwxrwxrwt. 10 root root 4096 Nov 18 16:24 /tmp
[root@centos6 /app]#

4.2、umask概念

我们通过root管理员和普通用户创建目录和文件的默认的权限是怎么定义的呢?

通过umask值:

知道umask值如何求创建的目录和文件权限是多少?

然后目录的值是777,转换成二进制为111 111 111

然后文件的值是666,抓换成二进制为110 110 110

比如umask值是022,转换成二进制为000 010 010

分别让umask和目录和文件运算,运算法则为当umask中值为0时不操作,当为1时,目录和文件所

对应位的值变为0,

umask计算规则

目录d 文件-
最高权限 111  111 111  110  110  110 umask 000 010 010 000 010 010 default 111 101 101 110 100 100 数字 7 5 5 6 4 4 符号 rwx r-x r-x rw- r-- r-- 注意 umask和文件权限进行运算时,如果得到的数字值为奇数需要加1,得偶数才是真正的计算结果
配置文件 作用
/etc/bashrc  全局所使用的一些参数  系统用户 umask 002 普通用户umask 022
~/.bashrc 普通用户所使用的一些参数
/etc/login.defs umask=077
umask命令 修改当前会话umask值并不修改配置文件,退出当前会话后配置丢失。
umask
umask: umask [-p] [-S] [mode]
默认显示当前用户umask值
mode 以数字开始就当做八进制数,否则就是和chmod一样的符号模式
    
    Options:
      -p        如果不加mode,就是以复合的结果输出当前umask值
      -S        以符号模式输出当前权限值,否则输出的是八进制数umask值,
#e.g.
[lq@centos6 ~]$umask  -p
umask 0002
[lq@centos6 ~]$umask  -S
u=rwx,g=rwx,o=rx  
#文件会自动去掉x,不可执行。
[lq@centos6 ~]$touch file
[lq@centos6 ~]$mkdir dir
[lq@centos6 ~]$ll file ;ll -d dir
-rw-rw-r--. 1 lq lq 0 Nov 18 17:35 file
drwxrwxr-x. 2 lq lq 4096 Nov 18 17:35 dir
#八进制数字模式
[lq@centos6 ~]$umask 022 
[lq@centos6 ~]$umask
0022
[lq@centos6 ~]$umask -S 
u=rwx,g=rx,o=rx
[lq@centos6 ~]$touch file2;mkdir dir2;ll file2 ;ll -d dir2
-rw-r--r--. 1 lq lq 0 Nov 18 17:42 file2
drwxr-xr-x. 2 lq lq 4096 Nov 18 17:42 dir2
#符号模式
[lq@centos6 ~]$umask u=rwx,g=rwx,o=rwx
[lq@centos6 ~]$umask
0000
[lq@centos6 ~]$umask -S
u=rwx,g=rwx,o=rwx
[lq@centos6 ~]$touch file3;mkdir dir3;ll file3 ;ll -d dir3   
-rw-rw-rw-. 1 lq lq 0 Nov 18 17:45 file3
drwxrwxrwx. 2 lq lq 4096 Nov 18 17:45 dir3
[lq@centos6 ~]$

4.3、文件的特殊权限chattr,lsattr

ls是我们正常查看文件的一种方式,如果文件有一些文件是有特殊属性的是看不到的,比如说有个文件,你管理员都删除掉的,就要考虑是不是设置了特殊权限,此时就要用lsattr查看

4.3.1、lsattr

NAME
    lsattr - list file attributes on a Linux second extended file system

SYNOPSIS
    lsattr [ -RVadv ] [ files...  ]
       
 -R:递归显示目录中的目录的列表
 -a:显示目录中的所有文件包括隐藏文件和ls -a 类似
 -d:列出目录的信息和ls -d类似
 -V:顺带列出程序的版本在行首
 -v: List the file’s version/generation number.不晓得啥意思


4.3.2、chattr

NAME
       chattr - change file attributes on a Linux file system
SYNOPSIS
       chattr [ -RVf ] [ -v version ] [ mode ] files...
       
  
-R: 递归改变目录下的所有内容
-V: 输出程序版本然后显示操作过程
-f: 禁止显示一些错误
编号 属性 作用
1 A 文件atime不能被修改
2 a 文件只能往里面添加内容,不能修改
3 d dump不会备份带有这个属性的文件
4 i
无法修改一个具有“i”属性的文件:它不能被删除或重命名,不能创建此文件的链接,也不能将数据写入文件。只有超级用户或进程具有cap_linux_immutable能力可以设置或清除此属性。
5 E 显示压缩文件有压缩错误。虽然可以通过lsattr显示,但它不能被chattr修改或清除
6 e 表示该文件使用区段映射磁盘上的块。虽然可以通过lsattr显示,但它不能被chattr修改或清除
7 I

由三码用来表示目录正在使用散列树索引。虽然可以通过lsattr显示,它不能被chattr修改或清除

8 h 意味着文件是(或曾经)大于2TB。虽然可以通过lsattr显示,它不能被chattr修改或清除
9 S 当修改“S”属性集的文件时,更改将在磁盘上同步写入;这相当于应用于文件子集的“同步”挂载选项。
10 X 指示COM压缩文件的原始内容可以直接访问。虽然可以通过lsattr显示,但不能被chattr修改或清除
11 Z 表示压缩文件是脏的,虽然可以通过lsattr显示,但不能被chattr修改或清除
12 c 数据以压缩的形式存储在磁盘上
13 s 当一个“s”属性设置文件被删除,它的块清零并写回磁盘
14 u

当删除带有“u”属性集的文件时,将保存其内容。这允许用户请求它的恢复删除

15 D

当目录被指定选项D时,更改将在磁盘上同步写入;这是相当于“目录同步”安装选项应用于档案的一个子集。

注意:

c,s,u这些选项可能在未来ext2和ext3的版本中实现。文件系统挂载为ext3为时,“J”选项才有效。“D”选项仅适用于Linux内核2.5.19后来。

4.4、acl


因为现在文件就3个可操作对象,如果我想对other部分的权限更精细化进行管理,我们就需要

acl(access control list)匹配某些参数然后执行默写操作

centos7之前版本,手动添加的分区需要手动添加文件系统对acl的支持

tune2fs -o acl /dev/sb1

mount -o acl /dev/sdb1 /mnt/test

那么如何判断一个文件有acl的属性呢,ll文件的时候会看到文件类型+权限后有个点. 

如果设置了acl了,这个点会变成+而且,可以通过getfacl看到acl的信息

4.4.1、getfacl

NAME
       getfacl - get file access control lists

SYNOPSIS
       getfacl [-aceEsRLPtpndvh] file ...

       getfacl [-aceEsRLPtpndvh] -
如果getfacl用在了不支持的acl的文件系统上,会提示拒绝访问 
显示全的格式如下:
1:  # file: somedir/    //文件名的绝对路径删除开头的/
2:  # owner: lisa       //所有者
3:  # group: staff      //所属组  
4:  # flags: -s-        //suid、sgid、sticky
5:  user::rwx           //所有者权限
6:  user:joe:rwx        //自定义用户权限       #effective:r-x
7:  group::rwx          //所属组权限       #effective:r-x
8:  group:cool:r-x      //自定义组权限
9:  mask::r-x           //所属组和自定义用户与组的最大权限
10:  other::r-x         //other权限
-----对目录下新建的文件而言默认的ACL,文件没有--------------------------------------------
11:  default:user::rwx   //所有权限
12:  default:user:joe:rwx//自定义用户的权限       #effective:r-x 实际生效的权限
13:  default:group::r-x  //所属组权限
14:  default:mask::r-x   //所属组和自定义用户与组的最大权限
15:  default:other::---  //other权限


-a:--access默认输出格式
-d:--default只显示头部信息
-c:--omit-header不显示头部信息
-e:--all-effective显示有效的权限内容
-E:--no-effective不显示有效的权限内容
-s:--skip-base
-R:--recursive递归
-L:--logical只是查看符号链接权限
-P:--physical查看符号链接的真实文件权限而不是符号链接
-t:--tabular 不显示头部信息,另外用tab分割不用:分割的形式显示
-p:--absolute-names 不要剥夺前导斜杠字符(“/”)。默认行为是取消前导斜杠字符
-n:--numeric 以数字的形式显示用户名和组名
-:1个破折号
如果文件名参数是一个破折号字符,getfacl读取来自标准输入做file参数
--:2个破折号

4.4.2、setfacl

NAME
   setfacl - set file access control lists

SYNOPSIS
   setfacl [-bkndRLPvh] [{-m|-x} acl_spec] [{-M|-X} acl_file] file ...

   setfacl --restore=file
       
-m:--modify=acl修改当前文件的ACL
-M:--modify-file=file
-x:--remove=acl删除当前文件的ACL
-X:--remove-file=file
-b:--remove-all删除文件的所有ACL条目
-k:--remove-default删除默认的ACL
-n:--no-mask
-d:--default添加默认的ACL
-R:--recursive递归
-L:--logical只是对符号链接设置权限
-P:--physical对符号链接的真实文件设置权限而不是符号链接
--test:先测试结果并不生效
--set=acl
--set-file=file:备份acl
--restore=file:恢复acl

ACL ENTRIES

d:{u:uid:perms,g:gid:perms,o::perms,m::perms} 
uid和gid如果为空表示设置所有者和所属组
perms权限的意思,可以用符号表示也可以用octal数字表示





上一篇:字节跳动面试官这样问有关字符串的问题!!


下一篇:js练习1(十秒钟阅读效果)