linux基础之权限管理
阅读原文时间:2023年07月10日阅读:1

本节内容

1. 权限类别

属主(owner) 属组(group) 其他人(other)

2. 查看权限

ls -l

十位: 第一位文件类型-,d,l,

3. 设置权限

chmod 选项 权限模式 filename

选项:-R: 递归设置

4. 字母数字权限

r: 读权限 -->4 -->SUID

w: 写权限-->2-->SGID

x: 执行权限-->1-->SBIT

-:无权限-->0

5. UMASK:022

创建文本666-022=644(创建文本的默认权限)

创建目录777-022=755(创建目录的默认权限)

6.读写执行权限

读权限:

文本:就是查看文本内容

目录:就是ls列出来目录下的文件

写权限:

文本:就是编辑文本内容

目录:就是删除,移动,复制,创建目录下的文件

执行权限:

文本:就是可以执行该文本(二进制程序和脚本)

目录:可以cd到该目录下

7.属主和属组(:和 . )

chown 选项 属主:属组 filename

chown -R 属主: filename(把属主和属组都改了)

chown -R :属组 filename(只更改了属组)

chown -R 属主:属组 filename(把属主和属组都改了)

chown -R 属主 filename(只更改属主)

8. 文件特殊权限

SUID:只能设置在二进制程序上面(不可以设置在目录上面,可以查看文本,编辑文本)

如果给二进制程序上面设置了SUID权限(属主和执行者必须有

执行权限),那么执行者在执行该二进制程序使瞬间获得属主权限

SGID:可以设置在二进制也可以设置在目录上面

SBIT:只能删除自己创建的文件

9. ACL权限

针对特定用户设置特定权限

setfacl -m u:ken:r filename创建

getfacl filename查看

setfacl -b filename删除

10. sudo

就是让某些用户拥有某些命令的最高权限

visudo

ken   ALL=(ALL) ALL

用户 地址 root   命令



一、权限概述

Linux系统一般将文件可存/取访问的身份分为3个类别:owner(拥有者)、group(和所有者同组的用户)、others(其他人,除了所有者,除了同组的用户以及除了超级管理员),且3种身份各有read(读)、write(写)、execute(执行)等权限。

linux系统中的三类人:属主、属组、其他人

如果root用户创建了test文件,默认属主为root,属组也是root,其他人ren1,ren1用户既不是root用户,也不再root组里面,是其他人。

在Linux中,还有一个神一样存在的用户,这就是root用户,因为在所有用户中它拥有最大的权限 ,所以管理着普通用户。

root用户可以无视读写权限,root用户无执行权限也是无法执行,但自身可以加上权限。

二、权限介绍

在多用户(可以不同时)计算机系统的管理中,权限是指某个特定的用户具有特定的系统资源使用权力,像是文件夹、特定系统指令的使用或存储量的限制。

在Linux中分别有读、写、执行权限:

读权限:

  对于目录来说,读权限影响用户是否能够列出目录结构

  对于文件来说,读权限影响用户是否可以查看文件内容

写权限:

  对目录来说,写权限影响用户是否可以在文件夹下“创建/删除/复制到/移动到”文档rm,mv,touch…

  对于文件来说,写权限影响用户是否可以编辑文件内容

执行权限:

对于目录来说:执行权限影响用户是否可以执行cd操作

  对于文件来说,特别脚本文件。执行权限影响文件是否可以运行。

三、查看文件权限

十位字符表示含义:

  第1位:表示文档类型,取值常见的有“d表示文件夹”、“-表示文件”、“l表示软连接”、“s表示套接字”、“c表示字符设备”、“b表示块状设备”等等;

  第2-4位:表示文档所有者的权限情况,第2位表示读权限的情况,取值有r、-;第3位表示写权限的情况,w表示可写,-表示不可写,第4位表示执行权限的情况,取值有x、-。

  第5-7位:表示与所有者同在一个组的用户的权限情况,第5位表示读权限的情况,取值有r、-;第6位表示写权限的情况,w表示可写,-表示不可写,第7位表示执行权限的情况,取值有x、-。

  第8-10位:表示除了上面的前2部分的用户之外的其他用户的权限情况,第8位表示读权限的情况,取值有r、-;第9位表示写权限的情况,w表示可写,-表示不可写,第10位表示执行权限的情况,取值有x、-。

权限分配中,均是rwx的三个参数组合,且位置顺序不会变化。没有对应权限就用 – 代替。

例子:

[root@renyz08 ~]# ll   #ll 是“ls -l”的别名

-rw-r--r-- 1 root root 0 7月 12 19:38 test

rw- 表示属主的权限。表示属主对test文件拥有读写权限,无执行权限

r-- 表示属组的权限。表示属组里面的用户对test文件拥有读权限,无写和执行权限

r-x 表示其他人的权限。表示其他人对test文件拥有读和执行权限,无写权限。

四、权限设置

语法:#chmod 选项 权限模式 文件

作用:修改文件的权限

常用选项:

-R:递归设置权限 (当文档类型为文件夹的时候)

(同时修改目录及目录下的所有文件)

权限模式:就是该文档需要设置的权限信息

文档:可以是文件,也可以是文件夹,可以是相对路径也可以是绝对路径。

注意点:如果想要给文档设置权限,操作者要么是root用户,要么就是文档的所有者。

1、用户表示

u:表示所有者身份owner(user)属主

g:表示给所有者同组用户设置(group)属组

o:表示others,给其他用户设置权限(其他人)

a:表示all,给所有人(包含ugo部分)设置权限

如果在设置权限的时候不指定给谁设置,则默认给所有用户设置

2、权限字符:

r:读

w:写

x:表示执行

-:表示没有权限

3、权限分配方式:

+:表示给具体的用户新增权限(相对当前)

-:表示删除用户的权限(相对当前)

=:表示将权限设置成具体的值(注重结果)【赋值】

例子1:给属主增加执行权限

-rw-r--r-- 1 root root    0 7月 12 19:38 test

[root@renyz08 ~]# chmod u+x test

[root@renyz08 ~]# ll

-rwxr--r-- 1 root root    0 7月 12 19:38 test

例子2:去掉属主的执行权限

[root@renyz08 ~]# chmod u-x test

[root@renyz08 ~]# ll

-rw-r--r-- 1 root root    0 7月 12 19:38 test

例子3:授予属主读写执行权限

方法一:

[root@renyz08 ~]# chmod u+x test

方法二:

[root@renyz08 ~]# chmod u=rwx test

[root@renyz08 ~]# ll

-rwxr--r-- 1 root root    0 7月 12 19:38 test

例子4:属主仅用于读权限

方法一:

[root@renyz08 ~]# chmod u-wx test

[root@renyz08 ~]# ll

-r--r--r-- 1 root root    0 7月 12 19:38 test

方法二:

[root@renyz08 ~]# chmod u=r test

[root@renyz08 ~]# ll

-r--r--r-- 1 root root    0 7月 12 19:38 test

例子5:给属组添加执行权限

[root@renyz08 ~]# chmod g+x test

[root@renyz08 ~]# ll

-r--r-xr-- 1 root root    0 7月 12 19:38 test

例子6:给属组删除执行权限

[root@renyz08 ~]# chmod g-x test

[root@renyz08 ~]# ls -l

-r--r--r-- 1 root root    0 7月 12 19:38 test

例子7:授予属组中用户读写执行权限

[root@renyz08 ~]# chmod g=rwx test

[root@renyz08 ~]# ll

-r--rwxr-- 1 root root    0 7月 12 19:38 test

例子8:给其他人添加执行权限

[root@renyz08 ~]# chmod o+x test

[root@renyz08 ~]# ll

-r--rwxr-x 1 root root    0 7月 12 19:38 test

例子9:给其他人删除执行权限

[root@renyz08 ~]# chmod o-x test

[root@renyz08 ~]# ll

-r--rwxr-- 1 root root    0 7月 12 19:38 test

例子10:给其他人添加读写执行权限

[root@renyz08 ~]# chmod o=rwx test

[root@renyz08 ~]# ll

-r--rwxrwx 1 root root    0 7月 12 19:38 test

思考:让ren2用户拥有root用户在/tmp目录下创建对的test文件的写权限?

-rw-r--r-- 1 root root 0 7月 12 20:32 test

方法一:

[root@renyz08 tmp]# chmod 0+w test

方法二:

[root@renyz08 tmp]# usermod -G root ren2

方法三:

[root@renyz08 tmp]# chown ren2 test

方法四:

[root@renyz08 tmp]# chown :ren2 test

4、用数字表示权限

经常会在一些技术性的网页上看到类似于#chmod  777  a.txt  这样的一个权限,这种形式称之为数字形式权限(777)。

读: r        4(2^2)

写:  w     2(2^1)

执行:x     1(2^0)

没有任何权限:0   对应---

如下:

rwxr–r        744

755           rwxr-xr-x

700           rwx------

655           rw-r-xr-x

644           rw-r—r--

600           rw-------

000           ---------

面试题:用超级管理员设置文档的权限命令是#chmod -R 731 aaa,请问这个命令有没有什么不合理的地方?

所有者 = 7 = 4 + 2 + 1 = 读 + 写 + 执行

同组用户 = 3 = 2 + 1 = 写 + 执行

其他用户 = 1 = 执行

问题在权限731中3表示写+执行权限,但是写又不必须需要能打开之后才可以写,因此必须需要具备读权限,因此权限不合理。以后建议各位在设置权限的时候不要设置这种“奇葩权限”。

单独出现2、3的权限数字一般都是有问题的权限

例子1:属主拥有读写权限,属组拥有读权限,其他人拥有读写执行权限

[root@renyz08 tmp]# chmod 647 test

[root@renyz08 tmp]# ll test

-rw-r--rwx 1 root root 0 7月 12 20:32 test

例子2:同时给所有用户添加执行权限

[root@renyz08 tmp]# chmod +x test #a+x 中a可以省略

[root@renyz08 tmp]# ll test

-rwxr-xrwx 1 root root 0 7月 12 20:32 test

例子3:同时给所有用户删除执行权限

[root@renyz08 tmp]# chmod -x test

[root@renyz08 tmp]# ll test

-rw-r--rw- 1 root root 0 7月 12 20:32 test

例子4:同时给所有用户添加读权限

[root@renyz08 tmp]# chmod +r test

[root@renyz08 tmp]# ll test

-rw-r--rw- 1 root root 0 7月 12 20:32 test

例子5:同时给所有用户删除读权限

[root@renyz08 tmp]# chmod -r test

[root@renyz08 tmp]# ll test

--w-----w- 1 root root 0 7月 12 20:32 test

例子6:同时给所有用户添加写权限

[root@renyz08 tmp]# chmod +w test

#如果前面不加a的话,默认只添加属主的写权限

[root@renyz08 tmp]# ll test

--w------- 1 root root 0 7月 12 20:32 test

[root@renyz08 tmp]# chmod a+w test

[root@renyz08 tmp]# ll test

--w--w--w- 1 root root 0 7月 12 20:32 test

例子7:同时删除所有人的写权限

[root@renyz08 tmp]# chmod a-w test

[root@renyz08 tmp]# ll test

---------- 1 root root 0 7月 12 20:32 test

设置权限注意事项:

要么只读

如果有写权限,那么就需要有读权限

5、-R 选项:在更改目录权限时使用

例子1:

[root@renyz08 tmp]# mkdir test

[root@renyz08 tmp]# ll test

总用量 0

[root@renyz08 tmp]# touch test/test{1..4}

[root@renyz08 tmp]# ll test

总用量 0

-rw-r--r-- 1 root root 0 7月 12 20:53 test1

-rw-r--r-- 1 root root 0 7月 12 20:53 test2

-rw-r--r-- 1 root root 0 7月 12 20:53 test3

-rw-r--r-- 1 root root 0 7月 12 20:53 test4

[root@renyz08 tmp]# chmod +x test

#不加-R选项仅仅只会更改ken目录本身的权限

[root@renyz08 tmp]# ls -ld test

drwxr-xr-x 2 root root 58 7月 12 20:53 test

[root@renyz08 tmp]# ll test

总用量 0

-rw-r--r-- 1 root root 0 7月 12 20:53 test1

-rw-r--r-- 1 root root 0 7月 12 20:53 test2

-rw-r--r-- 1 root root 0 7月 12 20:53 test3

-rw-r--r-- 1 root root 0 7月 12 20:53 test4

[root@renyz08 tmp]# chmod -R +x test

#加-R选项会把ken目录以及目录下的所有文件权限都会更改

[root@renyz08 tmp]# ll test

总用量 0

-rwxr-xr-x 1 root root 0 7月 12 20:53 test1

-rwxr-xr-x 1 root root 0 7月 12 20:53 test2

-rwxr-xr-x 1 root root 0 7月 12 20:53 test3

-rwxr-xr-x 1 root root 0 7月 12 20:53 test4

五、chown命令

作用:更改文件的属主(change owner)

语法:#chown  -R  新的username 文档路径

选项:

-R 同时更改目录以及目录下的所有文件的属主和属组(文件不需要-R)

例子1:改变test2文件的属主为ren2

[root@renyz08 tmp]# chown ren2 test/test2

例子2:改变test2文件的属组为ren3

[root@renyz08 tmp]# chown :ren3 test/test2

[root@renyz08 tmp]# ll test/test2

-rwxr-xr-x 1 ren2 ren3 0 7月 12 20:53 test/test2

例子3:同时更改为test3文件的属主和属组权限为root

方法一:

[root@renyz08 tmp]# chown root:root test/test3

[root@renyz08 tmp]# ll test/test3

-rwxr-xr-x 1 root root 0 7月 12 20:53 test/test3

方法二:

[root@renyz08 tmp]# chown root: test/test3

方法三:

[root@renyz08 tmp]# chown root.root test/test3

方法四:

[root@renyz08 tmp]# chown root. test/test3

例子4:-R 选项

[root@renyz08 tmp]# chown ren4. test

#不加-R仅仅更改目录本身的属主和属组

[root@renyz08 tmp]# ll

drwxr-xr-x 2 ren4 ren4    58 7月 12 20:53 test

[root@renyz08 tmp]# ll test

总用量 0

-rwxr-xr-x 1 root root 0 7月 12 20:53 test1

-rwxr-xr-x 1 ren2 ren3 0 7月 12 20:53 test2

-rwxr-xr-x 1 root root 0 7月 12 20:53 test3

-rwxr-xr-x 1 root root 0 7月 12 20:53 test4

[root@renyz08 tmp]# chown -R ren4. Test

#加上-R同时更改目录以及目录下的所有文件的属主和属组

[root@renyz08 tmp]# ll test

总用量 0

-rwxr-xr-x 1 ren4 ren4 0 7月 12 20:53 test1

-rwxr-xr-x 1 ren4 ren4 0 7月 12 20:53 test2

-rwxr-xr-x 1 ren4 ren4 0 7月 12 20:53 test3

-rwxr-xr-x 1 ren4 ren4 0 7月 12 20:53 test4

六、文件的特殊权限

SUID

SGID

SBIT

ACL

1、SUID(set uid设置用户ID)

限定:只能设置在二进制可执行程序上面。对目录设置无效

功能:程序运行时的权限从执行者变更成程序所有者的权限

注意:设定suid的命令其他人也需要有执行权限

uid权限设置:

chmod u+s cmd

例子1:给cat命令添加SUID权限(普通用户没法cat /etc/shadow)

[root@renyz08 ~]# chmod u+s `which cat`

[root@renyz08 ~]# ls -ld `which cat`

-rwsr-xr-x. 1 root root 54160 10月 31 2018 /usr/bin/cat

#文件有执行权限时,添加SUID后,显示s

[root@renyz08 ~]# chmod u-x `which cat`

[root@renyz08 ~]# ls -ld `which cat`

-rwSr-xr-x. 1 root root 54160 10月 31 2018 /usr/bin/cat

#文件没有执行权限时,添加SUID后,显示S

验证:

再次查看/etc/shadow文件发现可以看了

[ren23@renyz08 ~]$ cat /etc/shadow

root:$6$yqv.0UOIdStkIBmT$lr6lh4dghoNJQF6YoPn4upZFCUNT0df1SDujNlnIQzWKETrEJsYgdcqly611u1FXmkPblNMWG2swNETi7N5Ff1::0:99999:7:::

bin:*:17834:0:99999:7:::

daemon:*:17834:0:99999:7:::

2、SGID

限定:既可以给二进制可执行程序设置,也可以对目录设置权限

功能:在设置了SGID权限的目录下建立文件时,新创建的文件的所属组会继承上级目录的所属组

例子1:给目录test添加SGID权限

[root@renyz08 tmp]# ls -ld test

drwxr-xr-x 2 ren4 ren4 97 7月 13 09:01 test

[root@renyz08 tmp]# chmod g+s test

drwxr-sr-x 2 ren4 ren4    97 7月 13 09:01 test

[root@renyz08 tmp]# touch test/test123

[root@renyz08 tmp]# ll test/test123

-rw-r--r-- 1 root ren4 0 7月 13 10:25 test/test123

3、SBIT

对于设置sbit权限的文件,用户只能删除自己创建的文件,无法删除其他用户的文件

例子1:设置SBIT权限

[root@renyz08 ~]# chmod o+t /tmp/test

[root@renyz08 ~]# ls -ld /tmp/test

drwxrwsr-t 2 ren4 ren4 125 7月 13 10:33 /tmp/test

/tmp目录本身默认已经添加了SBIT权限!

[root@renyz08 ~]# ls -ld /tmp

drwxrwxrwt. 15 root root 4096 7月 13 09:41 /tmp

验证:

[ren2@renyz08 test]$ touch test22

[ren2@renyz08 test]$ su - ren3

[ren3@renyz08 test]$ rm -rf test22

验证无法删除!

如何删除?

[root@renyz08 ~]# chmod o-t /tmp/test

[ren3@renyz08 test]$ rm -f test22

[ren3@renyz08 test]$

4、ACL

扩展ACL  :access control list

作用:对特定的用户实现了权限管控

选项:-m (--modify) 表示设置的意思

例子1:设置ren2用户对文件test8拥有读写权限

[root@renyz08 test]# setfacl -m u:ren2:rw test8

-rw-rw-r--+ 1 root ren4 0 7月 13 10:33 test8

验证:

[root@renyz08 test]# id ren2

uid=1005(ren2) gid=0(root) 组=0(root),1011(ren3)

[root@renyz08 test]# id ren3

uid=1011(ren3) gid=1011(ren3) 组=1011(ren3),0(root)

[ren3@renyz08 test]$ su - ren2

[ren2@renyz08 ~]$ cd /tmp/test

[ren2@renyz08 test]$ cat test8

[ren2@renyz08 test]$ echo "123" > test8 #ren2用户可读可写

[ren2@renyz08 test]$ cat test8

123

[ren2@renyz08 test]$ su - ren3

[ren3@renyz08 ~]$ cd /tmp/test

[ren3@renyz08 test]$ cat test8

123

[ren3@renyz08 test]$ echo "dd" > test8 #ren3用户可读不可写

-bash: test8: 权限不够

怎么清除acl权限:

[root@renyz08 test]# setfacl -b test8

[root@renyz08 test]# getfacl test8

# file: test8

# owner: root

# group: ren4

user::rw-

group::r--

other::r--

七、sudo

sudo(switch user do)命令用来进行权限设置。Sudo可以让管理员(root)事先定义某些特殊命令谁可以执行。

默认sudo中是没有除root之外用户的规则,要想使用需先配置sudo。

Sudo配置文件:/etc/sudoers

该文件默认只读,不允许修改,因此不能直接修改。

a. 配置sudo文件请使用“#visudo”,打开之后其使用方法和vim一致

b. 配置普通用户的权限(在root下增加)

99 ## Allow root to run any commands anywhere

100 root    ALL=(ALL)       ALL

Root:表示用户名,如果是用户组,则可以写成“%组名”

ALL:表示允许登录的主机(地址白名单)

(ALL):表示以谁的身份执行,ALL表示root身份

ALL:表示当前用户可以执行的命令,多个命令可以使用“,”分割

例子1:让ren2用户拥有创建用户的功能

[root@renyz08 test]# visudo

101 ren2    ALL=(ALL)       /sbin/useradd

#ren2是用户名,ALL表示可以从任意主机进行登录(ALL) 以root的身份进行尽心命令的运行

#/sbin/useradd表示ren2用户可以以root的身份来执行创建用户

[root@ken tmp]# visudo

[ren2@renyz08 ~]$ useradd ren11

useradd: Permission denied.

useradd:无法锁定 /etc/passwd,请稍后再试。

[ren2@renyz08 ~]$ sudo useradd ren11

#配置visudo后需要使用sudo去执行相应的命令

我们信任您已经从系统管理员那里了解了日常注意事项。

总结起来无外乎这三点:

#1) 尊重别人的隐私。

#2) 输入前要先考虑(后果和风险)。

#3) 权力越大,责任越大。

#如果用户ren2设置了登录密码,在第一次执行命令时需要输入密码,同时5分钟之内不需要输入密码!

注意:在写sudo规则的时候不建议写直接形式的命令,而是写命令的完整路径。

路径可以使用which命令来查看

语法:#which 指令名称