Shell之用户与权限

时间:2019-06-13
本文章向大家介绍Shell之用户与权限,主要包括Shell之用户与权限使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

用户与组

  早期Linux系统设计为了能够实现多用户、多进程高效的利用服务器资源,在此种情况下,为了能够保证用户与用户之间的文件不被随意的访问及修改、删除等操作,用户、组的管理能在某种程序上实现管理用户或批量管理用户。由于Linux的设计哲学思想『一切皆文件』,用户对设备的访问就是对文件的访问。

安全上下文

  安全上下文就是当用户发起一个进程时,该进程将继承用户的相应权限,再以继承的权限来控制文件的访问权限。例如:

[root@asus-a53s ~]# /usr/bin/cat anaconda-ks.cfg    #取决于root对anaconda-ks.cfg的访问权限。
[xiao@asus-a53s ~]$ /usr/bin/cat anaconda-ks.cfg    #取决于 xiao对anaconda-ks.cfg的访问权限。

Linux用户

用户的分类

Linux下系统用户大致分为三类用户:

  • 超级用户:具有操作系统的一切权限,UID值为0。
  • 普通用户:仅针对自己家目录下面有写入权限,UID值500以上或者1000以上
  • 伪用户  :是为了方便系统管理,满足相应的系统进程文件属主的要求;伪用户不能登录系统终端;CentOS6 UID值 1 -- 499,CentOS7 UID值为1 – 999。

用户的配置

  • /etc/passwd:用户的基本属性文件
  • /etc/shadow:用户密码及其相关属性,可使用pwck命令校验格式无效用户等

/etc/passwd配置的格式及说明

root:x:0:0:root:/root:/bin/bash
上述文件内容总共分为七段,用分号隔开,说明如下:
第一段:描述用户的名称
第二段:密码占位符,x表示该用户可以使用密码登录,密码文件是shadow,为空代表不密码;开头第一个字符是*的,表示系统停用账户。
第三段:代表用户的ID号,简称UID
第四段:代表用户的主组号,简称GID
第五段:用户描述信息,如:名称、姓名、电话等等;
第六段:宿主目录位置
第七段:默认命令解释程序

/etc/shadow配置的格式及说明

root:$6$B9wp3OvD$WRDtiyw5aSglmKfJ8Pu...Z4yfj4oT2NG.:17498:0:99999:7:::
上述文件内容总共分为八段,亦以分号隔开,说明如下:
第一段:用户名,需与/etc/passwd文件里面的用户名一致
第二段:加密的登录口令,如果为空,则表示无密码;
     星号代表账号被锁定
     双感叹号代表用户口令已过期
        $6$开头内容表示密码用SHA-512加密
        $1$表示用的SHA-1代加密的
        $2$表示用Blowfish加密的
        $5$表示用SHA-256加密的
第三段:最后一次修改时间,表示是从某个时刻起到用户最后一次修改口令的的天数。每个系统的时间起点对点可能不一样,例如在linux中这个起点时间是1970年1月1日。
第四段:最小时间间隔,表示两次修改口令之间的所需的最小天数。0表示可以随时修改
第五段:最大时间间隔,表示口令保持有效的最大天数。99999表示一直有效。
第六段:警告时间,表示的是从系统开始警告用户到用户密码正式失效之间的天数。
第七段:不活动时间,表示的是用户没有登录活动但账号仍能保持有效的最大天数。
第八段:失效时间,字段给出的是一个绝对的天数,如果使用了这个字段,那么就给出相应账号的生存期。期满后,该账号就不再是一个合法的账号,也就不能再用来登录了。

Linux组

组的分类

  1. 主组:用户必须属于主组,且用户只能有一个主组,一个组可以是多个用户的主组。不可以把用户从主组中删除。
  2. 基本组:如果没有指定用户组,创建用户的时候系统会默认同时创建一个和这个用户名同名的组,这个组就是基本组,不可以把用户从基本组中删除。基本组也叫私有组。
  3. 附加组:一个用户可以属于多个附加组,除了主组或者基本组之外的组都是附加组。用户是可以从附加组中被删除的。

组的配置

  1. /etc/group:组的基本属性信息,可使用vigr命令编辑,可使用grpck校验格式,无效组等
  2. /etc/gshadow:组密码及其相关属性,可使用grpck校验合适,无效组等

/etc/group配置的格式及说明

root:x:0:
上述文件内容总共分为四段,用分号隔开,最后一段应该没有内容,所以这里并没有显示。说明如下:
第一段:组名称
第二段:组口令占位符,如果相应的组加了密码,内容在gshadow中,一般是x
第三段:组ID,简称GID
第四段:组内用户列表,如果一个组中有N个成员,这里都会相应的显示

/etc/gshadow配置的格式及说明

root:$6$PLRAi/Z/svr$PRelPtvLuGJqvFG3D8fbjYHDho2RQUe93glO.::
上述文件内容总共分为四段,用分号隔开,说明如下:
第一段:组的名称,同/etc/group文件中的名字一致
第二段:加密的组口令,如果为空或者!,则表示无密码;
        $6$开头内容表示密码用SHA-512加密
        $1$表示用的SHA-1代加密的
        $2$表示用Blowfish加密的
        $5$表示用SHA-256加密的
第三段:组管理者,可以为空,如果有N个用户组管理者,用逗号隔开
第四段:组内用户成员列表,如果有N个用户,则用逗号隔开

用户与组的管理命令

添加用户——useradd

格式

useradd [options] LOGIN

选项

-u : 指定用户的UID
-g : 指明用户所属基本组,可为组名,也可以GID,组或者GID必须存在
-c : 指定注释信息,如果有空格,需要使用" "包含
-d : 指定用户家目录位置,创建用户时,会自动从/etc/skel目录中复制文件到家目录下,如果指定的文件存在将不会复制文件,如果父目录不存在,创建也将会失败。
-s : 指定用户登录时使用的命令解释器
-r : 指定创建一个系统用户
-M : 不创建用户家目录 
-G : 指定附加组,多个使用逗号隔开
-D : 修改创建用户的配置信息,文件位于/etc/default/useradd
注:创建用户时的诸多默认设定配置文件为/etc/login.defs

示例

[root@localhost ~]# useradd -u 1003 -c "TestUser" -d /home/geek -s /bin/sh geek
[root@localhost ~]# getent passwd geek
geek:x:1003:1003:TestUser:/home/geek:/bin/sh


[root@localhost ~]# useradd sys -r -M -g 1001 -G root
[root@localhost ~]# getent passwd sys
sys:x:498:1001::/home/sys:/bin/bash
[root@localhost ~]# id sys
uid=498(sys) gid=1001(young) groups=1001(young),0(root)

[root@localhost ~]# useradd -D     #查看系统useradd命令的默认值
GROUP=100 
HOME=/home 
INACTIVE=-1 
EXPIRE= 
SHELL=/bin/bash 
SKEL=/etc/skel 
CREATE_MAIL_SPOOL=yes

说明:
新用户添加到GID为100的公共组 
新用户的HOME目录将会位于/home/username 
新用户账户密码在过期后不会被禁用 
新用户账户未被设置为某个日期后就过期 
新用户账户将bash shell作为默认shell 
系统会将/etc/skel目录下的内容复制到用户的HOME目录下 
系统为该用户账户在mail目录下创建一个用于接收邮件的文件 

修改内容:     
useradd –D -s shell 
useradd –D –b BASE_DIR 
useradd –D –g GROUP

修改用户属性——usermod

格式

usermod [options] LOGIN

选项

-u : 修改用户UID
-g : 修改用户GID
-c : 修改用户的注释信息
-d : 修改用户家目录,需要配合使用-m选项才会自动复制用户家目录下的文件到新的家目录
-m : move-home to new directory
-s : 修改用户的shell
-l : 修改用户的登陆名,即login名称
-G : 修改用户的附加组信息,需要配合-a(append)一起使用,如果不使用-a将删除原来的附加组
-a : --append,连接多个附加组的参数
-L : 锁定用户,即lock,在/etcpasswd文件中,密码前面加!(一个)
-U : 解锁用户,即unlock,在/etc/passwd文件中,取消密码前面的!号

示例

[root@localhost ~]# getent passwd user1
user1:x:600:600::/home/user1:/bin/bash

[root@localhost ~]# id user1
uid=600(user1) gid=600(user1) groups=600(user1)

[root@localhost ~]# usermod -u 700 -g user2 -aG bin,root -c 'linux' -d /none/user1 -s /bin/tsh -l linux user1

[root@localhost ~]# getent passwd linux
linux:x:700:601:linux:/none/user1:/bin/tsh

[root@localhost ~]# id linux
uid=700(linux) gid=601(user2) groups=601(user2),0(root),1(bin)

删除用户——userdel

格式

userdel [options] LOGIN

选项

-r : 删除用户的同时删除用户的家目录,即--remove参数

用户密码管理——passwd

格式

passwd [-k] [-l] [-u [-f]] [-d] [-e] [-n mindays] [-x maxdays] [-w warndays] [-i inactivedays] [-S] [--stdin] [username]

注意:

  1. passwd (修改自己的密码)
  2. passwd USERNAME(修改其他用户的密码,root权限 )

选项

-l : 锁定用户,在/etc/passwd的密码前面加!!,
-u : 解锁用户,在/etcpasswd的密码前!!取消
-d : --delete,删除用户密码
-e DATE : --expire,设定过期时间
-i DAYS : 非活动时间
-n days : 最短使用期限
-x days : 最长使用期限
-w days : 警告期限
--stdin : echo "PASSWD" | passwd --stdin root

示例

[root@localhost ~]# echo young | passwd --stdin geek
Changing password for user geek.
passwd: all authentication tokens updated successfully.

修改用户密码策略——chage

格式

chage [OPTION]… LOGIN

选项

-d:修改用户最近一次修改密码的日期
-E:修改账户的过期日期
-I:密码禁用期
-m:密码的最小使用期限
-M:密码的最大使用期限
-W:密码的警告时间
–l:显示密码策略

示例

实例一:查看mysql用户以及密码的有效期
[root@DB-Server ~]# chage -l mysql
Last password change : Mar 26, 2015
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : -1
Maximum number of days between password change : -1
Number of days of warning before password expires : -1
[root@DB-Server ~]#

实例二:设置mysql用户60天后密码过期,至少7天后才能修改密码,密码过期前7天开始收到告警信息。
[root@DB-Server ~]# chage -M 60 -m 7 -W 7 mysql
You have new mail in /var/spool/mail/root
[root@DB-Server ~]# chage -l mysql
Last password change : Mar 26, 2015
Password expires : May 25, 2015
Password inactive : never
Account expires : never
Minimum number of days between password change : 7
Maximum number of days between password change : 60
Number of days of warning before password expires : 7
[root@DB-Server ~]#
clip_image001

实例三:强制新建用户第一次登陆时修改密码
[root@DB-Server home]# useradd test
[root@DB-Server home]# passwd test
Changing password for user test.
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully.
[root@DB-Server home]# chage -d 0 test
You have new mail in /var/spool/mail/root
[root@DB-Server home]# chage -l test
Last password change : password must be changed
Password expires : never
Password inactive : never
Account expires : never
Minimum number of days between password change : 0
Maximum number of days between password change : 99999
Number of days of warning before password expires : 7

修改用户命令解释器——chsh

chsh:命令用来更改当前用户的shell类型。
使用权限:所有使用者

使用案例

[user1@localhost~]$ chsh
Changing fihanging shell for user1
Password: [del]    ###输入密码进行操作
New shell [/bin/tcsh]: ### [是目前使用的 shell]
[del]                ###输入密码进行性确认
[user1@localhost~]$ chsh -l ### 展示 /etc/shells 档案内容
/bin/bash
/bin/sh
/bin/ash
/bin/bsh
/bin/tcsh
/bin/csh

示例

# 我想知道我机器安装了哪些shell? 两种方法可以查看: 
第一种: [rocrocket@jb51.net ~]$ chsh -l 
/bin/sh 
/bin/bash 
/sbin/nologin 
/bin/zsh 
第二种: [rocrocket@jb51.net ~]$ cat /etc/shells 
/bin/sh 
/bin/bash 
/sbin/nologin 
/bin/zsh 
其实chsh -l也是来查看这个文件。

# 我想知道我当前正在使用的shell是哪个阿?
[rocrocket@jb51.net ~]$ echo $SHELL
/bin/bash
注意SHELL一定要是大写。可以看到,我目前使用的shell是/bin/bash

# 执行了zsh之后,我查看当前shell类型仍然是/bin/bash呢? 请注意,我们虽然执行了zsh,但是所谓“当前的shell”是一个大环境的概念,是针对一个已登录的用户而言的。而我们执行zsh只是启动了一个zsh的解释器程序而已,并没有改变大环境。如果想改变“当前的shell”,那么还是要使用chsh才可以。

# 我想把我的shell改成zsh!
[rocrocket@jb51.net ~]$ chsh -s /bin/zsh
Changing shell for rocrocket.
Password:
Shell changed.
使用chsh加选项-s就可以修改登录的shell了! 你会发现你现在执行echo $SHELL后仍然输出为/bin/bash,这是因为你需要重启你的shell才完全投入到zsh怀抱中去。

# chsh -s到底是修改了哪里? 秘密告诉你吧。chsh -s其实修改的就是/etc/passwd文件里和你的用户名 相对应的那一行。现在我来查看下:
[user@localhost~]$ cat /etc/passwd | grep ^rocrocket
rocrocket:x:500:500:rocrocket,China:/rocrocket/PSB/home:/bin/zsh
看!你可以发现输出内容的最后部分已经变成了/bin/zsh了!下次你重启的时候,linux就会读取这一命令来启动你的shell了! 好了,我要恢复正常工作,把shell修改会我熟悉的/bin/bash了!
[user@localhost~]$  chsh -s /bin/bash
Changing shell for rocrocket.
Password:
Shell changed.

更改用户个人细信息——chfn

chfn命令用于指定个人信息,finger用来查看个人信息。
chfn命令格式:
Usage: chfn    [ -f full-name ] [ -o office ] [ -p office-phone ] [ -h home-phone ] 
[ --help ] [ --version ]
[root@localhost ~]# chfn
Changing finger information for root.
Name [root]: young
Office []: geek
Office Phone []: 010110110
Home Phone []: 0101101101
Finger information changed.

查看个人信息——finger

[root@localhost ~]# finger root
Login: root                             Name: young
Directory: /root                        Shell: /bin/bash
Office: geek, 010110110                 Home Phone: 010-110-1101
On since Sun Jan  1 02:39 (CST) on pts/0 from 192.168.1.116
No mail.
No Plan.

查看用户的基本属性——id

选项

-u: UID
-g: GID
-G: Groups
-n: Name (与-u连用可现实名称)

示例

[root@localhost ~]# id geek
uid=1003(geek) gid=1003(geek) groups=1003(geek)
[root@localhost ~]# id
uid=0(root) gid=0(root) groups=0(root)
[root@localhost ~]# id -G
0
[root@localhost ~]# id -un
root

login.defs

login.defs是一个文件,位于/etc/目录下面;它定义了/etc/passwd和/etc/shadow配套的用户限制设定;这个文件是系统需要的,缺失并不影响系统的使用,但是也许会产生意想不到的错误。
如果/etc/shadow文件里有相同的选项,则以/etc/shadow里的设置为准,也就是说/etc/shadow的配置优先级高于/etc/login.defs。
[root@localhost~]#man login.defs
MAIL_DIR        /var/spool/mail
#创建用户时,要在目录/var/spool/mail中创建一个用户mail文件

PASS_MAX_DAYS   99999
#密码最大有效期

PASS_MIN_DAYS   0
#两次修改密码的最小间隔时间

PASS_MIN_LEN    5
#密码最小长度,对于root无效

PASS_WARN_AGE   7
#密码过期前多少天开始提示

UID_MIN      500
#用户ID的最小值

UID_MAX      60000
#用户ID的最大值

GID_MIN      500
#组ID的最小值

GID_MAX      60000
#组ID的最大值

#USERDEL_CMD   /usr/sbin/userdel_local
#当删除用户的时候执行的脚本

CREATE_HOME    yes
#使用useradd的时候是够创建用户目录

UMASK       077

USERGROUPS_ENAB yes
#用MD5加密密码
这里仅仅列出一部分,有其他的请自行man

创建组——groupadd

格式

groupadd [options] group

选项

-g : 指定GID号
-r : 指定为一个系统组

示例

实例一:
[root@localhost ~]# groupadd -g 700 -r CentOS

删除组——groupdel

[root@localhost ~]#groupdel test
注:当有用户将该用户组作为主组时,无法直接删除该用户组,必须先删除用户。

修改组属性——groupmod

格式

groupmod [options] GROUP

选项

-g : 修改GID号码
-n : 修改组名称 (groupmod -n NEW_GROUP OLD_GROUP)

示例

[root@localhost ~]# groupmod -g 701 -n centos test #修改属性
[root@localhost ~]# getent group centos
centos:x:701:

管理组成员与组密码——gpasswd

格式

gpasswd [OPTION] GROUP

选项

-a user: 将user添加至指定组中;
-d user: 从指定组中移除用户user
-A user1,user2,…: 设置有管理权限的用户列表

示例

实例一:将用户添加至组中,并设置管理员
[root@localhost ~]# groupadd admins
[root@localhost ~]# gpasswd -a user1 admins
Adding user user1 to group admins
[root@localhost ~]# gpasswd -A user1 admins
[root@localhost ~]# getent group admins
admins:x:1011:user1

实例二:设定组密码
[root@localhost ~]# gpasswd admins
Changing the password for group admins
New Password: 
Re-enter new password:

临时切换基本组——netgrp

格式

newgrp [-] [group]
- : 模拟用户登陆, 以实现重新初始化环境变量

示例

[root@localhost ~]# su - user3
[user3@localhost ~]$ id
uid=1009(user3) gid=1010(user3) groups=1010(user3)
[user3@localhost ~]$ newgrp - admins
Password: 
[user3@localhost ~]$ id
uid=1009(user3) gid=1011(admins) groups=1011(admins),1010(user3)

更改组成员——groupmems

格式

groupmems [options] [action]

选项

-g:更改为指定组(只有root可以使用)
-a:指定用户加入组
-d:从组中删除用户
-p:从组中清除所有成员

示例

[root@localhost ~]# groupmems -a user3 -g admins
[root@localhost ~]# id user3
uid=1009(user3) gid=1010(user3) groups=1010(user3),1011(admins)
[root@localhost ~]# groupmems -l -g admins
user1  user2  user3 
[root@localhost ~]# groupmems -p -g admins
[root@localhost ~]# getent group admins
admins:x:1011:

查看用户的组信息——groups

示例

[root@localhost ~]# groups user1 #查看用户user1的组信息
user1 : user1 root bin

感谢网上的老师给与的帮助:http://www.linuxidc.com/Linux/2017-02/140312.htm

文件与权限

文件的类型

常见文件类型描述如下:

d:    目录文件类型(directory)
-:    普通文件(ASCII)
l:    链接文件(类似快捷方式)
b:    块设备(硬盘、磁盘、U盘等存储介质)
p:    管道文件
c:    字符设备(鼠标、键盘等串口文件)
s:    套接文件(mysql.sock等)

权限的分类

权限说明,如下表

权限

对应数字

文件意义

目录意义

r

4

读取

列出

w

2

写入

创建

x

1

执行

进入

字母说明,如下表

字母

对应类

意义

u

user

u代表属主

g

group

g代表属组

o

other

o代表其他人

a

all

a代表所有用户与组

示例讲解

drwxr-xr-x.    2    root    mail        4096    1月  12 03:44    account
上述内容总共分为七段,第一段可以分为五段,所有讲解如下:
第一段:1.    d:表示该文件类型为目录
       2.    rwx:表示文件属主的权限大小
       3.    r-x:表示文件属组的权限大小
       4.    r-x:表示该文件的其他人权限大小
       5.    .:注意,最后面还有一个点,这个代表该文件带有SElinux的安全上下文权限,且对应的文件类型的不同,所代表的含义也不一样;目录中带点,表示有SElinux继承权限县;目录中带加号,表示只有ACL规则,没有SElinux继承权限;文件中带点,表示有权限继承;若是文件中带加号,表示既有ACL规则,也有SElinux权限;什么都不带,表示不继承,也没有ACL规则;
第二段:数字代表文件或者目录所对应的关联文件,“2”代表该目录有1个对应的关联目录,即“.”。
第三段:表示该文件的属主
第四段:表示该文件的属组
第五段:表示该文件的大小,单位Byte,不是bit。
第六段:表示文件的最后一次修改时间,默认以创建时间为标准
第七段:文件的名称

特殊权限

Linux下面有三种特殊的权限,分别是setuid、setgid、stick bit(粘滞位)。
1、 setuid: 简称SUID,用字母s表示;当s出现在拥有者的x权限上时,它有以下特点:
  a) SUID只能对二进制、可执行文件有效
  b) 执行者对于该文件具有执行权限时,执行者将暂时获得文件的属主权限
  c) 权限仅在此次运行过程中有效
  d) SUID仅可用在二进制程序上,不能够用在shell script上面。所以SUID的权限部分,还是要看shell script调用进来的程序设置,而不是shell script本身。


2、 setgid: 简称SGID,用字母s表示,可以对文件或者目录有效;当s出现在属组的x权限上时,它有一下特点:
  a) 使用者对目录有rx权限时,该使用者能进入到目录
  b) 使用者对此目录的属组将会直接变成该目录的属组,言外之意,使用者属于属组中的一员
  c) 若使用者对该目录有写入权限时,则新创建的文件的属组与此目录的属组一致
  d) 若SGID是针对二进制、可执行文件,则执行者将会在执行过中暂时获得属组的权限


3、 stick bit:简称SBIT,用字母t表示,仅对目录有效,该权限只能出现在其他人的x权限上,并且该权限需要配合写入权限才行,言外之意,其他人也需要对目录有写入权限;当其他人有写入权限,并且该目录设定了SBIT权限,则其他人在该目录下创建的文件或者目录只有创建者与root才拥有删除新建的内容。

三种特殊权限的应用场景和作用:

Suid的应用场景和作用:Suid只对二进制程序起作用,程序发起者在程序执行的时候继承程序拥有者的身份以程序拥有者的权限,以程序拥有者的身份去执行程序。应用场景为root用户给普通用户分配需要经常改动的配置文件的修改权限比如密码passwd.

Sgid作用:对二进制程序的作用与Suid基本一致。对目录的作用,当目录设置Sgid时,若用户在此目录下所创建的新文件的用户组与此目录的用户组一致。应用场景:在开发的时候需要将开发的东西共享出来大家都可以随时加入新成员不用再设置所属组对共享文件进行查看修改。

Sticky:目录设置后,所有用户只能对自己创建的文件进行增删改查,无法对其他人的文件进行删除、移动、重命名等操作。

示例

[root@asus-a53s /]# ls -lh test.sh 
-rwxr-xr-x. 1 root root 31 12月  3 15:04 test.sh
[root@asus-a53s /]# chmod 4755 test.sh 
[root@asus-a53s /]# ls -lh test.sh 
-rwsr-xr-x. 1 root root 31 12月  3 15:04 test.sh
注意:若是文件原有的权限位置没有执行权限,这里的s会变成S,这是在告诉你,文件没有执行权限!

隐藏权限

指的是用linux命令chattr命令设定的相关权限,这些权限一般情况下面用不得到,主要是用来做安全加固及特殊文件的处理时用的,下面我就讲下相关命令的使用。

设定隐藏权限——chattr

格式

chattr [-RV] [-+=AacDdijsSu] [-v version] files...

选项

-R:递归处理,将指定目录下的所有文件及子目录一并处理。
-V:显示详细过程有版本编号。
-v:设定文件或目录版本(version)。

+ :在原有参数设定基础上,追加参数。
- :在原有参数设定基础上,移除参数。
= :更新为指定参数设定。

A:文件或目录的 atime (access time)不可被修改(modified), 可以有效预防例如手提电脑磁盘I/O错误的发生。
S:硬盘I/O同步选项,功能类似sync。例如:文件被删除,就真的被删除啦
a:即append,设定该参数后,只能向文件中添加数据,而不能删除,多用于服务器日志文    件安全,只有root才能设定这个属性。
i:设定文件不能被删除、改名、设定链接关系,同时不能写入或新增内容。i参数对于文件  系统的安全设置有很大帮助。
c:即compresse,设定文件是否经压缩后再存储。读取时需要经过自动解压操作。
d:即no dump,设定文件不能成为dump程序的备份目标。
j:即journal,设定此参数使得当通过mount参数:data=ordered 或者 data=writeback 挂载的文件系统,文件在写入时会先被记录(在journal中)。如果filesystem被设定参数为  data=journal,则该参数自动失效。
s:保密性地删除文件或目录,即硬盘空间被全部收回。
u:与s相反,当设定为u时,数据内容其实还存在磁盘中,可以用于undeletion.

查看隐藏权限——lsattr

选项

-R:递归列示目录及文件属性。
-V:显示程序版本号。
-a:显示所有文件属性,包括隐藏文件(.)、当时目录(./)及上层目录(../)。
-d:仅列示目录属性。
-l:(此参数目前没有任何作用)。
-v:显示文件或目录版本。

示例

实例一:不能删除
[root@asus-a53s ~]# lsattr test.sh 
---------------- test.sh
[root@asus-a53s ~]# chattr +i test.sh 
[root@asus-a53s ~]# rm -rf test.sh 
rm: 无法删除"test.sh": 不允许的操作
[root@asus-a53s ~]# lsattr test.sh 
----i----------- test.sh

实例二:只能添加,不能删除,不能减少或者修改
[root@asus-a53s ~]# lsattr test.sh 
-----a---------- test.sh
[root@asus-a53s ~]# echo "test" >> test.sh 
[root@asus-a53s ~]# echo "test2" > test.sh 
-bash: test.sh: 不允许的操作

访问控制

什么是ACL

针对单一使用者、单一文件或者目录进行读写执行权限的设定的权限类型。

ACL针对的范围

使用者(u):可以针对使用者来设定权限
群组(g):可以针对属组来设定权限
其他人(o):可以针对其他人来设定权限
默认权限(m):可以针对在该目录下面新建文件或者目录时,规范新数据的权限

ACL的启动

[root@localhost~]#mount -o remount,acl /  ##临时生效
[root@localhost~]#sed -e '1 s/defaults/defaults,acl/' /etc/fstab  ##永久生效
[root@localhost~]# mount –a –o remount

开启ACL规则,步骤如下:
临时开启mount -o remount,acl 挂载内容
永久开启:在/etc/fstab文件中,指定内容的defautls内容后加入acl,用分号隔开,然后进行重新挂载

设定ACL规则

设定指定目录或文件的ACL规则——setfacl

格式

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

选项

-b:移除所有设定的ACL规则
-k:移除默认设定的ACL规则
-m:设定后续ACL参数
-x:删除后续ACL参数
-R:递归的对所有文件及目录进行操作
-d:设定默认的acl规则。
--restore=file:从文件恢复备份的acl规则(这些文件可由getfacl -R产生)。通过这种机制可以恢复整个目录树的acl规则。此参数不能和除--test以外的任何参数一同执行。
--test:测试模式,不会改变任何文件的acl规则,操作后的acl规格将被列出。
-L:跟踪符号链接,默认情况下只跟踪符号链接文件,跳过符号链接目录。
-P:跳过所有符号链接,包括符号链接文件。
-v:查看软件版本
-h:获取帮助信息

示例

实例一:
[root@asus-a53s ~]# mkdir test
[root@asus-a53s ~]# cd test
[root@asus-a53s test]# touch file1
[root@asus-a53s test]# chmod 777 file1 
[root@asus-a53s test]# getfacl file1 
# file: file1                ##文件的名称
# owner: root                ##文件的属主
# group: root                ##文件的属组
user::rwx                    ##属主的权限
group::rwx                ##属组的权限
other::rwx                ##其他人的权限

[root@asus-a53s test]# setfacl -m u:user2:r file1     ##让user2用户对file1文件可读
[root@asus-a53s test]# ls -l file1 
-rwxrwxrwx+ 1 root root 0 12月  3 19:00 file1
[root@asus-a53s test]# getfacl file1 
# file: file1
# owner: root
# group: root
user::rwx
user:user2:r--                ##user2用户对文件的权限
group::rwx
mask::rwx
other::rwx

实例二:
[root@asus-a53s ~]# setfacl -m g:user2:rw test.sh 
[root@asus-a53s ~]# getfacl test.sh 
# file: test.sh
# owner: root
# group: root
user::rw-
group::r--
group:user2:rw-            ##user2组对文件的权限(effective:r--)
mask::rw-    ##使用者或群组所所设定的权限必须要存在于mask的权限
other::r—
注意:如果设定的使用者或者群组或者其他人不满足mask默认权限规则,则会将无效的权限去掉,只保留有效的权限,这个问题一定要想清楚!

实例三:
[root@asus-a53s ~]# setfacl -m m:x test.sh 
[root@asus-a53s ~]# getfacl  test.sh 
# file: test.sh
# owner: root
# group: root
user::rwx
group::r--            #effective:---
group:user2:rw-        #effective:---
mask::--x
other::r-x

查看ACL规则

查看指定目录或文件的ACL规则——getfacl

格式

getfacl [-aceEsRLPtpndvh] file...

选项

-a , --access:显示文件或目录的访问控制列表。
-d , --default:显示文件或目录的默认(缺省)的访问控制列表。
-c , --omit-header:不显示默认的访问控制列表。
-R , --recursive:操作递归到子目录。
-t , --tabular:使用列表输格式出ACL设置信息。
-n , --numeric:显示ACL信息中的用户和组的UID和GID。
-p , --absolute-names:

示例

实例一:
[root@asus-a53s ~]# getfacl test.sh        ##getfacl对文件权限查看
# file: test.sh
# owner: root
# group: root
user::rwx
group::r--
group:user2:rw-
mask::rw-
other::rwx

实例二:
[root@localhost testdir]# getfacl -R ./dir/ > acl.txt        ##从现有文件的ACL规则中进行备##份和恢复
[root@localhost testdir]# cat acl.txt
# file: dir/
# owner: root
# group: root
# flags: -s-
user::rwx
group::r-x
group:g1:rw-
mask::rwx
other::r-x
[root@localhost testdir]# setfacl -b -R ./dir/
[root@localhost testdir]# ll -d .
drwxr-xr-x. 3 root root 4096 Aug  4 22:16 .
[root@localhost testdir]# ll  -d ./dir
drwxr-sr-x. 2 root root 4096 Aug  4 22:07 ./dir
[root@localhost testdir]# setfacl --restore=acl.txt
[root@localhost testdir]# ll  -d ./dir
drwxrwsr-x+ 2 root root 4096 Aug  4 22:07 ./dir

修改属主——chown

格式

chown[OPTION]… [OWNER][:[GROUP]] FILE… 

选项

-R: 递归修改
–reference=FILE1 FILE2… 以file1做参考文件修改file2的属主属组
OWNER  只修改属主
OWNER:GROUP  同时修改属主属组
:GROUP  只修改属组,命令中的冒号可用.替换;

示例

[root@localhost cwn]# ll
total 0
-rw-r--r-- 1 root root 0 Jan  1 06:30 test.txt
[root@localhost cwn]# chown user1 test.txt 
[root@localhost cwn]# ll test.txt 
-rw-r--r-- 1 user1 root 0 Jan  1 06:30 test.txt
[root@localhost cwn]# chown :user2 test.txt 
[root@localhost cwn]# ll test.txt 
-rw-r--r-- 1 user1 user2 0 Jan  1 06:30 test.txt
[root@localhost cwn]# ll						

原文地址:https://www.cnblogs.com/guge-94/p/11017449.html