Linux | 文件权限

文件权限

普通权限

在 Linux系统中一切都是文件,每个文件都有所有者和所属组,但是每个文件的类型不尽相同,因此 Linux 系统使用了不同的字符来加以区分这些文件:

-: 普通文件

d: 目录文件

l: 链接文件

b: 块设备文件

c: 字符设备文件

p: 管道文件

在 Linux 系统中,规定了文件的所有者、所有组,其它人对文件所拥有 读( r)、写(w)、执行(x)等权限,读 权限表示可以读取文件的内容,写 权限表示可以对文件进行 新增、编辑、修改、删除文件的实际内容,执行 权限表示能够运行一个脚本程序。

Linux | 文件权限

这是使用ll 命令查看的文件属性,他的第一列有十个字母,第一个字母代表的是文件类型,后面九个字母,每三个分为一组,可以分为三组,分别代表着:文件拥有着所属组其它用户rwx表示这一组对这个目录和目录中的文件拥有读写执行的权限。

权限分配 文件所有者 文件所属组 其它用户
权限项 执行 执行 执行
字符表示 r w x r w x r w x
数字表示 4 2 1 4 2 1 4 2 1

在第二列和第三列 分别表示这个文件的所属用户和用户组。

我们可以通过命令对文件设置权限,并且重新设置所属用户和用户组:

	# 设置权限 给  test.txt 文件的用户设置 读写执行,用户组有 读写,其它用户只可以 读
	chmod 764 test.txt 
	# 设置用户和用户组 把 test.txt 文件的用户和所属组都设置为 test 
	chown test:test test.txt 

特殊权限

SUID

我们先查看一个特殊文件的权限:

	# 查看passwd 命令文件
	ls -l /bin/passwd

Linux | 文件权限

可以看到,原本表示文件所有者的执行权限的 x 权限位,现在却被 s 权限代替,这种权限我们就称为 SUID 权限。

SUID 特殊权限仅适用于可执行文件,具有的功能是,只要用户没有文件的执行权限,那么当用户执行这个文件的时候,就会以文件所有者的身份去执行文件,一旦执行结束,身份就会切换就会随之消失。

比如说,系统中用户的密码都是存在 /etc/shadow 文件中,但是这个文件的权限是:

Linux | 文件权限

可以看到,这个文件的权限,只有 root 用户可以操作,但是我们用普通用户执行 passwd 命令的时候,也可以修改这个用户的密码。

我们可以看上面 passwd 文件的所有者执行权限,是 s 权限,说明普通用户执行这个权限的时候,是以 root 用户的身份去执行的,如果以 root 身份去执行的,那么就可以修改 /etc/shadow 文件了,

我们可以把 /bin/passwd 命令文件的s 权限去掉,命令是:

	# 删除权限
	chmod u-s /bin/passwd
	# 添加权限
	chmod u+s /bin/passwd

当我们把 s 权限去掉之后,普通用户已经不可以修改自己的用户密码了,这就说明了 s 权限位的作用。

当然,我们在平时的工作,学习中,不要轻易设置 SUID,否则容易带来重大的安全隐患。

SGID

当一个文件或者目录的组权限的 x 权限位变成 s 的时候,就称之为 SGID,

Linux | 文件权限

SGID 文件和 SUID 文件类似,都是当一个用户不具备这个目录或者文件的执行权限的时候,会把用户的扩展用户组中临时添加这个用户组,当执行完之后,就会删除这个临时的扩展用户组。

SGID 对文件的作用:

SGID 只针对可执行文件有效,只有可执行文件被赋予 SGID 权限,普通文件赋予 SGID 没有一点用处。

用户需要对此可执行文件有 x 权限。

用户在执行具有 SGID 权限的可执行文件时,用户的群组身份会变为文件所属群组。

SGID 权限赋予用户改变组身份的效果,只在可执行文件运行过程中有效。

与 SUID 对比,SGID 赋予用户的是文件所属组的权限,SUID 赋予用户的是文件所有者的权限。

SGID 对目录的作用:

当一个用户被赋予 SGID 权限后,进入此目录的普通用户,其有效群组会变为该目录的所属组,会使得用户在创建文件或目录时,该文件或目录的所属组将不再是用户的所属组,而使用的是目录的所属组。

也就是说,只有当普通用户对具有 SGID 权限的目录有 rwx 权限时,SGID 的功能才能完全发挥出来,比如说,如果用户对该目录仅能有 rx 权限,则用户进入此目录后,虽然其有效群组变为此目录的所属组,但由于没有 x 权限,用户无法在目录中创建文件或者目录,SGID 权限也就无法发挥作用。

	# 去除 SGID 权限
	chmod g-s test
	@ 添加 SGID 权限
	chmod g+s test

SBIT

SBIT 可以理解为粘着位,粘滞位,防删除位等。

SBIT 权限仅对于目录有效,一旦目录设定了 SBIT 权限,则用户在此目录下创建的文件或者目录,就只有自己和 root 才有权利修改或者删除该文件。

Linux | 文件权限

比如系统 \路径下面的 tmp 文件夹就有 SBIT 权限。这个目录下面的文件只能 root 和 用户自己的文件能删除,其它用户的文件是无法修改或删除的。

设置文件的特殊权限

我们要先知道,我们平时给文件赋权的时候,是通过:

	chmod 777 test

给 test 文件赋予了最高的权限,并且这三个 7 分别代表这,拥有者,所属组,其它用户 的最高权限。其中的一个 7 代表的是: r(4) + w(2) + x(1) = 7

如果我们要给文件或目录指定特殊权限,只需要在这三个数字前面加上一个数字就可以了,用来放置给文件或目录设置的特殊权限。

	SUID --> 4
	SGID --> 2
	SBIT --> 1

如果想给文件添加上 SUID,就可以这样设置了:

	chmod 4777 test

或者给目录设置为共享文件夹,只有用户自己和 root 用户才可以修改内容:

	chmod 1777 test

还有非常多的用法,这里就不多说了,但是提醒一下,特殊权限还是少用,尽量给文件或目录赋予具体的权限。


细节决定成败!
个人愚见,如有不对,恳请扶正!

Linux | 文件权限

上一篇:linux运维常用命令


下一篇:Win32下 Qt与Lua交互使用