文件权限【持续整理】

Linux系统上对文件的权限有着严格的控制,用于如果想对某个文件执行某种操作,必须具有对应的权限方可执行成功。这也是Linux有别于Windows的机制,也是基于这个权限机制,Linux可以有效防止病毒自我运行,因为运行的条件是必须要有运行的权限,而这个权限在Linux是用户所赋予的。

​ Linux的文件权限有以下设定:

1、Linux下文件的权限类型一般包括读,写,执行。对应字母为 r、w、x。

2、Linux下权限的属组有 拥有者、群组、其它组 三种。每个文件都可以针对这三个属组(粒度),设置不同的rwx(读写执行)权限。

3、通常情况下,一个文件只能归属于一个用户和组, 如果其它的用户想有这个文件的权限,则可以将该用户加入具备权限的群组,一个用户可以同时归属于多个组。

在这里插入图片描述

一、文件类型

​ 第一位最高位代表的是文件的类型,类型可以是下面几个中的一个:

d代表的是目录(directroy)
-代表的是文件(regular file)
s代表的是套字文件(socket)
p代表的管道文件(pipe)或命名管道文件(named pipe)
l代表的是符号链接文件(symbolic link)
b代表的是该文件是面向块的设备文件(block-oriented device file)
c代表的是该文件是面向字符的设备文件(charcter-oriented device file)

二、文件权限

​ 如果我们要表示一个文件的所有权限详情,有两种方式:

第一种是十位二进制表示法 ,(三个属组的每个权限使用一个二进制位,再加一个最高位共十位),可简化为三个八进制数字形式(如 755)

另外一种十二位二进制表示法(十二个二进制位),可简化为四个八进制数字形式(如4755)

十位权限表示

常见的权限表示形式有

-rw------- (600)    只有拥有者有读写权限。
-rw-r--r-- (644)    只有拥有者有读写权限;而属组用户和其他用户只有读权限。
-rwx------ (700)    只有拥有者有读、写、执行权限。
-rwxr-xr-x (755)    拥有者有读、写、执行权限;而属组用户和其他用户只有读、执行权限。
-rwx--x--x (711)    拥有者有读、写、执行权限;而属组用户和其他用户只有执行权限。
-rw-rw-rw- (666)    所有用户都有文件读、写权限。
-rwxrwxrwx (777)    所有用户都有读、写、执行权限。

​ 后九位解析: 我们知道Linux权限总共有三个属组(或者说粒度),这里我们给每个属组使用三个位置来定义三种操作(读、写、执行)权限,合起来则是权限的后九位。 上面我们用字符表示权限,其中 -代表无权限,r代表读权限,w代表写权限,x代表执行权限。(后九位的前3位对应拥有者权限、4-6位对应群组权限、7-9对应其他组权限)

​ 实际上,后九位每个位置的意义(代表某个属组的某个权限)都是固定的,如果我们将各个位置权限的有无用二进制数 1和 0来代替,则只读、只写、只执行权限,可以用三位二进制数表示为

r-- = 100
-w- = 010
--x = 001
--- = 000

​ 转换成八进制数,则为 r=4, w=2, x=1, -=0(这也就是用数字设置权限时为何是4代表读,2代表写,1代表执行)

​ 实际上,我们可以将所有的权限用二进制形式表现出来,并进一步转变成八进制数字:

rwx = 111 = 7
rw- = 110 = 6
r-x = 101 = 5
r-- = 100 = 4
-wx = 011 = 3
-w- = 010 = 2
--x = 001 = 1
--- = 000 = 0

由上可以得出,每个属组的所有的权限都可以用一位八进制数表示,每个数字都代表了不同的权限(权值)。如 最高的权限为是7,代表可读,可写,可执行。

​ 故 如果我们将每个属组的权限都用八进制数表示,则文件的权限可以表示为三位八进制数

-rw------- =  600
-rw-rw-rw- =  666
-rwxrwxrwx =  777

chmod权限更改命令

一般使用格式
命令:
chmod [可选项] <mode> <file...>

参数说明:
[可选项]
  -c, --changes          like verbose but report only when a change is made (若该档案权限确实已经更改,才显示其更改动作)
  -f, --silent, --quiet  suppress most error messages  (若该档案权限无法被更改也不要显示错误讯息)
  -v, --verbose          output a diagnostic for every file processed(显示权限变更的详细资料)
       --no-preserve-root  do not treat '/' specially (the default)
       --preserve-root    fail to operate recursively on '/'
       --reference=RFILE  use RFILE's mode instead of MODE values
  -R, --recursive        change files and directories recursively (以递归的方式对目前目录下的所有档案与子目录进行相同的权限变更)
       --help		显示此帮助信息
       --version		显示版本信息
[mode] 
    权限设定字串,详细格式如下 :
    [ugoa][+-=][rwx][,...]
    其中
    [ugoa]
    u 表示该档案的拥有者,g 表示与该档案的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示所有(包含上面三者)。
    [+-=]
    + 表示增加权限,- 表示取消权限,= 表示唯一设定权限。
    [rwx]
    r 表示可读取,w 表示可写入,x 表示可执行
 	
[file...]
    文件列表(单个或者多个文件、文件夹)

范例

1、设置所有用户可读取文件 a.conf
chmod ugo+r a.conf 
或 
chmod a+r  a.conf

2、设置 c.sh 只有 拥有者可以读写及执行
chmod u+rwx c.sh

3、设置文件 a.conf 与 b.xml 权限为拥有者与其所属同一个群组 可读写,其它组可读不可写
chmod a+r,ug+w,o-w a.conf b.xml

4、设置当前目录下的所有档案与子目录皆设为任何人可读写
chmod -R a+rw *
数字权限使用格式
命令:
chmod <abc> file...

参数说明:
a,b,c各为一个数字,分别代表User、Group、及Other的权限。
相当于简化版的
chmod u=权限,g=权限,o=权限 file...
而此处的权限将用8进制的数字来表示User、Group、及Other的读、写、执行权限

范例

1、设置所有人可以读写及执行
chmod 777 file  (等价于  chmod u=rwx,g=rwx,o=rwx file 或  chmod a=rwx file)

2、设置拥有者可读写,其他人不可读写执行
chmod 600 file (等价于  chmod u=rw,g=---,o=--- file 或 chmod u=rw,go-rwx file )

十二位权限(Linux附加权限)

附加权限相关概念

​ linux除了设置正常的读写操作权限外,还有关于一类设置也是涉及到权限,叫做Linux附加权限。包括 SET位权限(suid,sgid)粘滞位权限(sticky)

SET位权限

​ suid/sgid是为了使“没有取得特权用户要完成一项必须要有特权才可以执行的任务”而产生的。 一般用于给可执行的程序或脚本文件进行设置,其中SUID表示对属主用户增加SET位权限,SGID表示对属组内用户增加SET位权限。执行文件被设置了SUID、SGID权限后,任何用户执行该文件时,将获得该文件属主、属组账号对应的身份。在许多环境中,suid 和 sgid 很管用,但是不恰当地使用这些位可能使系统的安全遭到破坏。所以应该尽量避免使用SET位权限程序。(passwd 命令是为数不多的必须使用“suid”的命令之一)。

suid(set User ID,set UID)的意思是进程执行一个文件时通常保持进程拥有者的UID。然而,如果设置了可执行文件的suid位,进程就获得了该文件拥有者的UID。

sgid(set Group ID,set GID)意思也是一样,只是把上面的进程拥有者改成进程组就好了。
表示形式(10位权限)

​ 如果一个文件被设置了suid或sgid位,会分别表现在所有者或同组用户的权限的可执行位上;如果文件设置了suid还设置了x(执行)位,则相应的执行位表示为s(小写)。但是,如果没有设置x位,它将表示为S(大写)。如:

1、-rwsr-xr-x 表示设置了suid,且拥有者有可执行权限
2、-rwSr--r-- 表示suid被设置,但拥有者没有可执行权限
3、-rwxr-sr-x 表示sgid被设置,且群组用户有可执行权限
4、-rw-r-Sr-- 表示sgid被设置,但群组用户没有可执行权限
chmod权限更改命令

​ 类似于上面chmod赋予一般权限的命令:

chmod u+s filename 	设置suid位
chmod u-s filename 	去掉suid设置
chmod g+s filename 	设置sgid位
chmod g-s filename 	去掉sgid设置
粘滞位权限
	粘滞位权限即sticky。一般用于为目录设置特殊的附加权限,当目录被设置了粘滞位权限后,即便用户对该目录有写的权限,也不能删除该目录中其他用户的文件数据。设置了粘滞位权限的目录,是用ls查看其属性时,其他用户权限处的x将变为t。 使用chmod命令设置目录权限时,+t、-t权限模式可分别用于添加、移除粘滞位权限。
表示形式(10位权限)

​ 一个文件或目录被设置了粘滞位权限,会表现在其他组用户的权限的可执行位上。如果文件设置了sticky还设置了x(执行)位,其他组用户的权限的可执行位为t(小写)。但是,如果没有设置x位,它将表示为T(大写)。如:

1、-rwsr-xr-t 表示设置了粘滞位且其他用户组有可执行权限
2、-rwSr--r-T 表示设置了粘滞位但其他用户组没有可执行权限
chmod权限更改命令
chmod +t <文件列表..>
十二位的权限表示

​ 附加权限除了用十位权限形式表示外,还可以用用十二位字符表示。

11 10 9 8 7 6 5 4 3 2 1 0
S  G  T r w x r w x r w x

SGT分别表示SUID权限、SGID权限、和 粘滞位权限,这十二位分别对应关系如下:

​ 第11位为SUID位,第10位为SGID位,第9位为sticky位,第8-0位对应于上面的三组rwx位(后九位)。

​ 在这十二位的每一位上都置值。如果有相应的权限则为1, 没有此权限则为0。

-rw-r-sr-- 的值为: 0 1 0  1 1 0  1 0 0  1 0 0
-rwsr-xr-x 的值为: 1 0 0  1 1 1  1 0 1  1 0 1
-rwsr-sr-x 的值为: 1 1 0  1 1 1  1 0 1  1 0 1 
-rwsr-sr-t 的值为: 1 1 1  1 1 1  1 0 1  1 0 1

​ 如果将则前三位SGT也转换成一个二进制数,则

suid 的八进制数字是4
sgid 的代表数字是 2
sticky 位代表数字是1

​ 这样我们就可以将十二位权限三位三位的转化为4个八进制数。其中

最高的一位八进制数就是suid,sgdi,sticky的权值。
第二位为 拥有者的权值
第三位为 所属组的权值
最后一位为 其他组的权值
chmode权限更改命令
	类似于正常权限的数字权限赋值模式(使用三位八进制数字赋值),我们可以使用4位八进制数字同时赋值正常权限和附加权限。

chmod <sabc> file...

其中s是表示附加权限的把八进制数字,abc与之前一致,分别是对应User、Group、及Other(拥有者、群组、其他组)的权限。因为SUID对应八进制数字是4,SGID对于八进制数字是2,则“4755”表示设置SUID权限,“6755”表示同时设置SUID、SGID权限。

我们进一步将上小节的例子中的二进制数转变为八进制表示形式,则

-rw-r-sr-- = 0 1 0 1 1 0 1 0 0 1 0 0 = 2644 
-rwsr-xr-x = 1 0 0 1 1 1 1 0 1 1 0 1 = 4755
-rwsr-sr-x = 1 1 0 1 1 1 1 0 1 1 0 1 = 6755
-rwsr-sr-t = 1 1 1 1 1 1 1 0 1 1 0 1 = 7755

例:

​ 设置 netlogin 的权限为拥有者可读写执行,群组和其他权限为可读可执行

chmod 755 netlogin

​ 设置 netlogin 的权限为拥有者可读写执行,群组和其他权限为可读可执行,并且设置suid

chmod 4755 netlogin

​ chmod 4755与chmod 755对比多了附加权限值4,这个4表示其他用户执行文件时,具有与所有者同样的权限(设置了SUID)。

为什么要设置4755 而不是 755? 
	假设netlogin是root用户创建的一个上网认证程序,如果其他用户要上网也要用到这个程序,那就需要root用户运行chmod 755 netlogin命令使其他用户也能运行netlogin。但假如netlogin执行时需要访问一些只有root用户才有权访问的文件,那么其他用户执行netlogin时可能因为权限不够还是不能上网。这种情况下,就可以用 chmod 4755 netlogin 设置其他用户在执行netlogin也有root用户的权限,从而顺利上网。

三、修改文件拥有者/所属用户组

chown命令

​ chown命令是change owner(改变拥有者)的缩写。chown命令的用途很多,还可以顺便直接修改所属用户组。如果要连目录下的所有子目录或文件同时更改文件拥有者的话,直接加上-R的参数即可。

基本语法
chown [-R] 账号名称 文件或目录
chown [-R] 账号名称:用户组名称 文件或目录
	上一行的另一种写法    chown [-R] 账号名称.用户组名称 文件或目录

参数
-R : 进行递归( recursive )的持续更改,即连同子目录下的所有文件、目录
都更新成为这个用户组。常常用在更改某一目录的情况。

范例

更改文件拥有者

在这里插入图片描述

更改文件用户+用户组

在这里插入图片描述

递归更改文件用户+用户组

在这里插入图片描述

chgrp命令

​ chgrn命令就是change group(改变用户组)的缩写。

基本语法
chgrp [-R] 用户组名称 文件或目录

参数
-R : 进行递归( recursive )的持续更改,即连同子目录下的所有文件、目录都更新成为这个用户组。常常用在更改某一目录的情况。

范例

在这里插入图片描述

四、默认权限

引言

在登录Linux系统后,为什么我们创建的目录或者文件的权限每次都是统一的?我们做以下实验:新建一个用户userA,然后分别创建目录dir01和dir02,文件t1.txt和t2.txt。

[root@linux01 ~]# useradd userA
[root@linux01 ~]# su - userA
[userA@linux01 ~]$ ll
total 0
[userA@linux01 ~]$ mkdir dir01
[userA@linux01 ~]$ mkdir dir02
[userA@linux01 ~]$ touch t1.txt
[userA@linux01 ~]$ touch t2.txt
[userA@linux01 ~]$ ll
total 8
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir01
drwxr-x--- 2 userA userA 4096 Mar 27 10:25 dir02
-rw-r----- 1 userA userA    0 Mar 27 10:25 t1.txt
-rw-r----- 1 userA userA    0 Mar 27 10:25 t2.txt

从上述的实验中发现,每次创建目录的权限都是drwxr-x—,即为750,文件的权限都是-rw-r-----即为640。我们能想到的必定这是个默认权限,那这个默认权限由谁来控制?答案是:umask。

[userA@linux01 ~]$ umask
0027

是的,我们可以通过umask来改变用户的创建文件和目录的默认权限,Linux是注重安全性的OS,而安全离不开权限的设置,对于创建新的目录和文件设定必要的初始权限是必不可少的,Linux和Windows在权限一个很大的区别就是:Windows中,新建目录和文件是继承上级目录权限;Linux是通过使用umask设置的默认权限给新建的目录和文件赋予初始权限。下面将一起走进umask的学习和使用。

umask介绍

首先,我们要了解的是,Linux文件的最大权限是666,目录的最大权限是777,为何目录要比文件权限大?因为目录需要有执行权(x)才能够进入到目录中。

umask的作用是在用户登录Linux系统环境下,设置用户创建目录和文件的初始化权限。

umask命令

语法

umask [-p] [-S] [mode]

参数
-p:表示完整打印umask内容。
-S:表示以符号形式显示设置。
mode:表示设置权限,mode和chmod的命令格式一样。

示例

[userA@linux01 ~]$ umask -p
umask 0027
[userA@linux01 ~]$ umask -S
u=rwx,g=rx,o=
[userA@linux01 ~]$ umask u=rw
[userA@linux01 ~]$ umask -p -S
umask -S u=rw,g=rx,o=
[userA@linux01 ~]$ umask -p
umask 0127
[userA@linux01 ~]$ umask u=rwx
[userA@linux01 ~]$ umask -p
umask 0027
[userA@linux01 ~]$ umask o=x
[userA@linux01 ~]$ umask -p
umask 0026
[userA@linux01 ~]$ umask -p -S
umask -S u=rwx,g=rx,o=x

umask存放位置

​ 一般umask的值可以在/etc/profile文件中定义。

# By default, we want umask to get set. This sets it for login shell
# Current threshold for system reserved uid/gids is 200
# You could check uidgid reservation validity in
# /usr/share/doc/setup-*/uidgid file
if [ $UID -gt 199 ] && [ "`/usr/bin/id -gn`" = "`/usr/bin/id -un`" ]; then
    umask 002
else
    umask 022
fi
··· ···
··· ···
umask 027

​ 其中,我们可以看到账号UID>199UID=GID用户名=用户组名时,umask值为002,否则,umask值为022
  umask 027表示当前用户的umask掩码值设置为027。

umask值计算

​ 上面一直在讲umask掩码值,那这个值究竟怎么计算?或者说,这个掩码值和目录或文件的默认权限关系是怎样的?

[userA@linux01 ~]$ umask
0027

​ 我们通过umask命令获取到当前用户的umask掩码值为0027,为何是4位?其实真正有效的是后3位。第1位是代表文件所具有的特殊权限(SetUID、SetGID、Sticky BIT)。

通过umask值我们可以反推出用户新建目录和文件的默认权限是什么。

原理

1、将目录或文件的默认最高权限(目录777、文件666)和umask掩码值都转换为二进制。
2、对umask取反。
3、将两个二进制值做与运算。
4、将与运算后的二进制值转换为十进制,即为用户的新建目录或文件的默认权限。
示例
目录场景
掩码值:0022
目录默认最高权限:777

计算默认权限:

1、转为二进制:
777 = 0111 0111 0111
022 = 0000 0010 0010

2、umask取反
NOT运算:1111 1101 1101

3、与运算
0111 0111 0111 总权限777
1111 1101 1101 umask取反
====================
0111 0101 0101 新建目录默认权限

4、转为十进制
0111 0101 0101=755
即该用户新建目录的默认权限为755,即为rwxr-xr-x。
文件场景
掩码值:0022
目录默认最高权限:666

计算默认权限:

1、转为二进制:
666 = 0110 0110 0110
022 = 0000 0010 0010

2、umask取反
NOT运算:1111 1101 1101

3、与运算
0110 0110 0110 总权限666
1111 1101 1101 umask取反
====================
0110 0100 0100 新建目录默认权限

4、转为十进制
0110 0100 0100 = 644
即该用户新建目录的默认权限为644,即为rw-r--r--。

公式

按照umask计算的原理很麻烦,所以弄一个公式来总结计算如下:

目录(文件)的初始权限 = 目录(文件)的最大默认权限 - umask权限

而这种公式方式需要注意分类:

目录公式:
用户目录默认权限 = 777 - umask值

文件公式:
1)偶数umask:用户文件默认权限 = 666 - umask偶数值
2)奇数umask:用户文件默认权限 = 666 - umask奇数值 + 1
示例
1、对照原理示例umask值=022,计算如下:
用户目录默认权限:777-022=755,即为rwxr-xr-x。
用户文件默认权限:666-022=644,即为rw-r--r--。

2、对照引言中的实验umask值=027,计算如下:
用户目录默认权限:777-027=750,即为drwxr-x---。
用户文件默认权限:666-027+1=640,即为-rw-r-----。

umask值修改

暂时修改

暂时修改的方式,可以通过umask命令来更改,比如计算出权限对应的umask值要改为027,则直接用该用户登录Linux系统后,使用命令umask 027即可。但是,一旦用户退出登录后,umask将恢复默认值,刚才设置的将会失效。所以,这种umask命令方式,只是适合当前会话。

永久修改

除了使用umask命令进行当前会话的用户默认权限设置外,我们还可以对该用户永久性修改umask值。针对某个用户修改,需要用该用户登录Linux,然后修改/etc/profile文件中的umask值。

修改前:

[userA@linux01 ~]$ umask
0027
[userA@linux01 ~]$ vim /etc/profile
  • 7
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值