Hexo

点滴积累 豁达处之

0%

文件权限属性

权限管理

1 文件权限

我们以/etc/passwd 文件为例,用ll长列出其属性如下所示

1
2
[root@centos6 ~]# ll /etc/passwd
-rw-r--r--. 1 root root 1619 Jan 19 10:39 /etc/passwd

–rw–r–r–:代表文件的权限。

1:代表文件的引用计数

root:代表文件所有者

root:代表文件所属组

1619:代表文件大小

Jan 19 10:39:代表文件创建时间

/etc/passwd:代表文件名

每个文件针对每类访问访问者都定义了三种权限 r == 4 w == 2 x == 1

对于文件来说:

r:可以使用文件查看类工具获取其内容

w:可以修改其内容

x:可以执行此文件

对于目录来说:

r:可以使用ls查看此目录中文件列表

w:可以在此目录中创建,删除文件

x:可以使用ls -l查看此目录中文件列表,可以进入此目录

-:代表没有权限

文件类型说明

p表示命名管道文件

d表示目录文件

l表示符号连接文件

-表示普通文件

s表示socket文件

c表示字符设备文件

b表示块设备文件

1 chmod 命令

chmod命令用来变更文件或目录的权限

权限范围的表示法如下:

  • u User,即文件或目录的拥有者;
  • g Group,即文件或目录的所属群组;
  • o Other,除了文件或目录拥有者或所属群组之外,其他用户皆属于这个范围;
  • a All,即全部的用户,包含拥有者,所属群组以及其他用户;
  • s 特殊功能说明:变更文件或目录的权限。

语法 : chmod(选项)(参数)

选项

-c:效果类似“-v”参数,但仅回报更改的部分;
-f:不显示错误信息;
-R:递归处理,将指令目录下的所有文件及子目录一并处理;
-v:显示指令执行过程;

示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
[root@localhost app]#ll file1 
-rw-r--r--. 1 root root 0 Jan 27 17:38 file1
[root@localhost app]#chmod u+x,g+w file1 //给文件所属人加上执行权限,给文件所属组加上写权限
[root@localhost app]#ll file1
-rwxrw-r--. 1 root root 0 Jan 27 17:38 file1

[root@localhost app]#ll file1
-rwxrw-r--. 1 root root 0 Jan 27 17:38 file1
[root@localhost app]#chmod u=rwx,g=rwx,o=rw file1 //让文件所属人有全部权限,让文件所属组有全部权限,让其他人对此文件有读写权限
[root@localhost app]#ll file1
-rwxrwxrw-. 1 root root 0 Jan 27 17:38 file1

[root@localhost app]#ll file1
-rwxrwxrw-. 1 root root 0 Jan 27 17:38 file1
[root@localhost app]#chmod 400 file1 //用数字方式修改文件权限,让只有文件所属人有读取权限,所属组和其他人对文件没有权限
[root@localhost app]#ll file1
-r--------. 1 root root 0 Jan 27 17:38 file1

[root@localhost app]#ll file1
-r--------. 1 root root 0 Jan 27 17:38 file1
[root@localhost app]#chmod u+w file1 //给文件加上权限,这里u+w表示给文件所属人加上写权限,同理g+w表示给所属组叫上写权限,o+w表示给其他人加上些权限
[root@localhost app]#ll file1
-rw-------. 1 root root 0 Jan 27 17:38 file1
[root@localhost app]#chmod a+w file1 //+w前面不跟参数时默认表示给所属人权限位叫上写权限,a+w表示给所有权限位都加上w权限
[root@localhost app]#ll file1
-rw--w--w-. 1 root root 0 Jan 27 17:38 file

2 umask

用途 预设权限(权限掩码)

我们知道, 当我们建立一个目录或文件时,它都会带一个默认的权限:

​ 若使用者建立为 ‘文件’ 则预设 ‘没有可执行 ( x ) 项目’, 亦即只有 rw 这两个项目, 用数字表示就是666或字母 –rw-rw-rw-

​ 若使用者建立为 ‘目录’, 则由于 x 与是否可以进入此目录有关, 因此预设为所有权限均开放, 亦即为777 或字母d-rwx-rwx-rwx

​ umask就与这个默认权限有关. 那么 umask 是在搞什么呢? umask 就是指定 ‘目前用户在建立档案或目录时候的权限默认值’.

用法

1 查看 我们可以这样查看umask默认值

1
2
3
4
[root@localhost app]#umask -S    //以字符形式显示
u=rwx,g=rx,o=rx
[root@localhost app]#umask -p //以数字形式显示(这里我们只看后三位)
umask 0022

要注意的是,umask 的数字指的是该默认值需要减掉的权限

因此,上面的022实际上是去掉了其他用户的写权限,对于文件来说也就是, 实际权限是644即:-rw-r–r-

对于目录来说, 实际是755, 即:-rwxr-xr-x

2 设置 我们可以这样对umask值修改

1
2
3
4
5
6
7
8
9
10
11
[root@localhost app]#touch file1
[root@localhost app]#ll file1
-rw-r--r--. 1 root root 0 Jan 27 17:38 file1
[root@localhost app]#umask -p
umask 0022
[root@localhost app]#umask 002 //umask后跟数字可修改
[root@localhost app]#umask -p
umask 0002
[root@localhost app]#touch file2
[root@localhost app]#ll file2
-rw-rw-r--. 1 root root 0 Jan 27 19:16 file2

umask后面接3个数字就可以设定了.我们可以看到本来创建的文件是默认rw-r–r–权限,但修改完umask值后默认权限就变为rw-rw-r–

但这种修改umask值的方式只是临时修改,若要长期修改umask的值, 可以把它写进/etc/profile或/.profile或/.bash_profile中.

3 chown

​ chown命令改变某个文件或目录的所有者和所属的组,该命令可以向某个用户授权,使该用户变成指定文件的所有者或者改变文件所属的组。用户可以是用户或者是用户UID,用户组可以是组名或组id。文件名可以使由空格分开的文件列表,在文件名中可以包含通配符。

只有文件主和超级用户才可以便用该命令。

语法 : chown(选项)(参数)

选项 :

-c:效果类似“-v”参数,但仅回报更改的部分;
-f:不显示错误信息;
-h:只对符号连接的文件作修改,而不更改其他任何相关文件;
-R:递归处理,将指定目录下的所有文件及子目录一并处理;
-v:显示指令执行过程;
–dereference:效果和“-h”参数相同;
–help:在线帮助;
–reference=<参考文件或目录>:把指定文件或目录的拥有者与所属群组全部设成和参考文件或目录的拥有者与所属群组相同;
–version:显示版本信息。

示例:

将目录/usr/meng及其下面的所有文件、子目录的文件所属人改成 liu:

chown -R liu /usr/meng

4 chgrp

​ chgrp命令用来改变文件或目录所属的用户组。该命令用来改变指定文件所属的用户组。其中,组名可以是用户组的id,也可以是用户组的组名。文件名可以 是由空格分开的要改变属组的文件列表,也可以是由通配符描述的文件集合。如果用户不是该文件的文件主或超级用户(root),则不能改变该文件的组。

​ 在UNIX系统家族里,文件或目录权限的掌控以拥有者及所属群组来管理。您可以使用chgrp指令去变更文件与目录的所属群组,设置方式采用群组名称或群组识别码皆可。

语法 chgrp(选项)(参数)

选项

-c:效果类似“-v”参数,但仅回报更改的部分;
-f:不显示错误信息;
-h:只对符号连接的文件作修改,而不是该其他任何相关文件;
-R:递归处理,将指令目录下的所有文件及子目录一并处理;
-v:显示指令执行过程;
–reference=<参考文件或目录>:把指定文件或目录的所属群组全部设成和参考文件或目录的所属群组相同;

实例

将/usr/meng及其子目录下的所有文件的用户组改为mengxin

chgrp -R mengxin /usr/meng

5 stat

stat命令用于显示文件的状态信息。stat命令的输出信息比ls命令的输出信息要更详细。

语法

1
stat(选项)(参数)

选项

1
2
3
4
5
-L:支持符号连接;
-f:显示文件系统状态而非文件状态;
-t:以简洁方式输出信息;
--help:显示指令的帮助信息;
--version:显示指令的版本信息。

参数

文件:指定要显示信息的普通文件或者文件系统对应的设备文件名。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[root@localhost ~]# ls -l myfile
-rw-r--r-- 1 root root 0 2010-10-09 myfile

[root@localhost ~]# stat myfile
file: “myfile”
Size: 0 Blocks: 8 IO Block: 4096 一般空文件
Device: fd00h/64768d Inode: 194805815 Links: 1
Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
Access: 2010-12-12 12:22:35.000000000 +0800
Modify: 2010-10-09 20:44:21.000000000 +0800
Change: 2010-10-09 20:44:21.000000000 +0800

[root@localhost ~]# stat -f myfile
File: "myfile"
id: 0 Namelen: 255 type: ext2/ext3
Block size: 4096 Fundamental block size: 4096
Blocks: Total: 241555461 free: 232910771 Available: 220442547
Inodes: Total: 249364480 Free: 249139691

[root@localhost ~]# stat -t myfile
myfile 0 8 81a4 0 0 fd00 194805815 1 0 0 1292127755 1286628261 1286628261 4096

7 acl权限

1 简介

给指定的用户指定目录分配指定的权限,就是 ACL 权限分配。

2 查看分区 ACL 权限

​ 我们看某个文件(Linux系统中目录也是文件,一切皆是文件)是否支持 ACL 权限,首先要看文件所在的分区是否支持 ACL 权限。

查看当前系统有哪些分区:df -h

1
2
3
4
5
6
7
8
9
10
[root@izbp12c0zpe8t4yri0xphiz ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 40G 8.4G 29G 23% /
devtmpfs 911M 0 911M 0% /dev
tmpfs 920M 0 920M 0% /dev/shm
tmpfs 920M 468K 920M 1% /run
tmpfs 920M 0 920M 0% /sys/fs/cgroup
tmpfs 184M 0 184M 0% /run/user/0
overlay 40G 8.4G 29G 23% /var/lib/docker/overlay2/merged
[root@izbp12c0zpe8t4yri0xphiz ~]#

查看指定分区详细文件信息:dumpe2fs -h 分区路径

下面是查看 根分区/ 的详细文件信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[root@izbp12c0zpe8t4yri0xphiz ~]# dumpe2fs -h /dev/vdal
dumpe2fs 1.42.9 (28-Dec-2013)
dumpe2fs: No such file or directory while trying to open /dev/vdal
Couldn't find valid filesystem superblock.
[root@izbp12c0zpe8t4yri0xphiz ~]# dumpe2fs -h /dev/vda1
dumpe2fs 1.42.9 (28-Dec-2013)
Filesystem volume name: <none>
Last mounted on: /
Filesystem UUID: eb448abb-3012-4d8d-bcde-94434d586a31
Filesystem magic number: 0xEF53
Filesystem revision #: 1 (dynamic)
Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super large_file huge_file uninit_bg dir_nlink extra_isize
Filesystem flags: signed_directory_hash
Default mount options: user_xattr acl //该出标注acl
Filesystem state: clean
Errors behavior: Continue

3 开启分区 ACL 权限

临时开启分区 ACL 权限

1
mount -o remount,acl /

重新挂载根分区,并挂载加入 acl 权限。注意这种命令开启方式,如果系统重启了,那么根分区权限会恢复到初始状态。

永久开启分区 ACL 权限

1 修改配置文件 /etc/fstab

1
2
3
4
5
6
7
8
9
#
# /etc/fstab
# Created by anaconda on Sun Oct 15 15:19:00 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=eb448abb-3012-4d8d-bcde-94434d586a31 / ext4 defaults , acl 1 1
// 只需在defaults后面加上 , acl

上面是修改根分区拥有 acl 权限

1
UUID=eb448abb-3012-4d8d-bcde-94434d586a31 /                       ext4    defaults , acl      1 1

2 重新挂载文件系统或重启系统,使得修改生效

1
mount -o remount /

4 设定 ACL 权限

选项:

-m 设定acl权限

-x 删除指定的acl权限

-b 删除所有的acl权限

-d 设定默认acl权限

-k 删除默认acl权限

-R 递归设定acl权限

①、给用户设定 ACL 权限:setfacl -m u:用户名:权限 指定文件名

②、给用户组设定 ACL 权限:setfacl -m g:组名:权限 指定文件名

**注意: ** 我们给用户或用户组设定 ACL 权限其实并不是真正我们设定的权限,是与 mask 的权限“相与”之后的权限才是用户的真正权限,一般默认mask权限都是rwx,与我们所设定的权限相与就是我们设定的权限。mask 权限下面我们会详细讲解

​ 范例:所有者root用户在根目录下创建一个文件目录/project,然后创建一个QQ群所属组,所属组里面创建两个用户zhangsan和lisi。所有者和所属组权限和其他人权限是770。

然后创建一个旁听用户 pt,给他设定/project目录的 ACL 为 r-x。

Linux_acl1

目录 /project 的所有者和所属组其他人权限设定为 770。接下来我们创建旁听用户 pt,并赋予 acl 权限 rx

Linux_acl2

为了验证 pt 用户对于 /project 目录没有写权限,我们用 su 命令切换到 pt 用户,然后进入 /project 目录,在此目录下创建文件,看是否能成功:

Linux_acl3

  上面提示权限不够,说明 acl 权限赋予成功,注意如下所示,如果某个目录或文件下有 + 标志,说明其具有 acl 权限。

Linux_acl4

5 查看 ACL 权限

Linux_acl5

6 最大有效权限 mask

​ 我们给用户或用户组设定 ACL 权限其实并不是真正我们设定的权限,是与 mask 的权限“相与”之后的权限才是用户的真正权限,一般默认mask权限都是rwx,与我们所设定的权限相与就是我们设定的权限。

  我们通过 getfacl 文件名 也能查看 mask 的权限,那么我们怎么设置呢?

1
setfacl -m m:权限 文件名

Linux_acl6

7 删除 ACL 权限

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

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

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

1
setfacl -x g:组名 文件名

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

1
setfacl -b 文件名

8 递归 ACL 权限

  通过加上选项 -R 递归设定文件的 ACL 权限,所有的子目录和子文件也会拥有相同的 ACL 权限。

1
setfacl -m u:用户名:权限 -R 文件名

9 默认 ACL 权限

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