文件的特殊权限 SUID SGID SBIT chmod命令,chown命令

2024-04-12 07:58

本文主要是介绍文件的特殊权限 SUID SGID SBIT chmod命令,chown命令,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

SUID 是一种对二进制程序进行设置的特殊权限,可以让二进制程序的执行者临时拥有属主的权限(仅对拥有执行权限的二进制程序有效)。例如,所有用户都可以执行 passwd 命令来修改自己的用户密码,而用户密码保存在/etc/shadow 文件中。仔细查看这个文件就会发现它的默认权限是 000,也就是说除了 root 管理员以外,所有用户都没有查看或编辑该文件的权限。但是,在使用 passwd 命令时如果加上 SUID 特殊权限位,就可让普通用户临时获得程序所有者的身份,把变更的密码信息写入到 shadow 文件中。这很像我们在古装剧中见到的手持尚方宝剑的钦差大臣,他手持的尚方宝剑代表的是皇上的权威,因此可以惩戒贪官,但这并不意味着他永久成为了皇上。因此这只是一种有条件的、临时的特殊权限授权方法。

查看 passwd 命令属性时发现所有者的权限由 rwx 变成了 rws,其中 x 改变成 s 就意味着该文件被赋予了 SUID 权限。另外有读者会好奇,那么如果原本的权限是 rw-呢?如果原先权限位上没有 x 执行权限,那么被赋予特殊权限后将变成大写的 S。

[jingpan@localhost ~]$ ls -l /etc/shadow
---------- 1 root root 1995 8月  22 09:56 /etc/shadow
[jingpan@localhost ~]$ ls -l /usr/bin/passwd 
-rwsr-xr-x. 1 root root 30768 11月 24 2015 /usr/bin/passwd

SGID 主要实现如下两种功能:

➢ 让执行者临时拥有属组的权限(对拥有执行权限的二进制程序进行设置);

➢ 在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

SGID 的第一种功能是参考 SUID 而设计的,不同点在于执行程序的用户获取的不再是文件所有者的临时权限,而是获取到文件所属组的权限。举例来说,在早期的 Linux 系统中,/dev/kmem 是一个字符设备文件,用于存储内核程序要访问的数据,权限为:
cr--r----- 1 root system 2, 1 Feb 11 2017 kmem

大家看出问题了吗?除了 root 管理员或属于 system 组成员外,所有用户都没有读取该文件的权限。由于在平时我们需要查看系统的进程状态,为了能够获取到进程的状态信息,可在用于查看系统进程状态的 ps 命令文件上增加 SGID 特殊权限位

查看 ps 命令文件的属性信息:
-r-xr-sr-x 1 bin system 59346 Feb 11 2017 ps

这样一来,由于 ps 命令被增加了 SGID 特殊权限位,所以当用户执行该命令时,也就临时获取到了 system 用户组的权限,从而可以顺利地读取设备文件了。

前文提到,每个文件都有其归属的所有者和所属组,当创建或传送一个文件后,这个文件就会自动归属于执行这个操作的用户(即该用户是文件的所有者)。如果现在需要在一个部门内设置共享目录,让部门内的所有人员都能够读取目录中的内容,那么就可以创建部门共享目录后,在该目录上设置 SGID 特殊权限位。这样,部门内的任何人员在里面创建的任何文件都会归属于该目录的所属组,而不再是自己的基本用户组。此时,我们用到的就是 SGID 的第二个功能,即在某个目录中创建的文件自动继承该目录的用户组(只可以对目录进行设置)。

[root@localhost c++]# cd /tmp/
[root@localhost tmp]# mkdir testidr
[root@localhost tmp]# ls -ald testidr/
drwxr-xr-x 2 root root 4096 8月  22 10:18 testidr/
[root@localhost tmp]# chmod -Rf 777 testidr/
[root@localhost tmp]# chmod -Rf g+s testidr/
[root@localhost tmp]# ls -ald testidr/
drwxrwsrwx 2 root root 4096 8月  22 10:18 testidr/

在使用上述命令设置好目录的 777 权限(确保普通用户可以向其中写入文件),并为该目录设置了 SGID 特殊权限位后,就可以切换至一个普通用户,然后尝试在该目录中创建文件,并查看新创建的文件是否会继承新创建的文件所在的目录的所属组名称: 

[root@localhost tmp]# su jingpan
[jingpan@localhost tmp]$ 
[jingpan@localhost tmp]$ cd /tmp/testidr/
[jingpan@localhost testidr]$ echo "test test" > test
[jingpan@localhost testidr]$ ls -al test
-rw-rw-r-- 1 jingpan root 10 8月  22 10:19 test

除了上面提到的 SGID 的这两个功能,我们再介绍两个与本小节内容相关的命令:chmod和 chown。chmod 命令是一个非常实用的命令,能够用来设置文件或目录的权限,格式为“chmod [参数] 权限 文件或目录名称”。如果要把一个文件的权限设置成其所有者可读可写可执行、所属组可读可写、其他人没有任何权限,则相应的字符法表示为 rwxrw----,其对应的数字法表示为 760。通过前面的基础学习和当前的练习实践,现在大家可以感受到使用数字法来设置文件权限的便捷性了吧。

[root@localhost testidr]# ls -al test
-rw-rw-r-- 1 jingpan root 10 8月  22 10:19 test
[root@localhost testidr]# chmod 760 test
[root@localhost testidr]# ls -l test
-rwxrw---- 1 jingpan root 10 8月  22 10:19 test

除了设置文件或目录的权限外,还可以设置文件或目录的所有者和所属组,这里使用的命令为 chown,其格式为“chown [参数] 所有者:所属组 文件或目录名称”。

chmod 和 chown 命令是用于修改文件属性和权限的最常用命令,它们还有一个特别的共性,就是针对目录进行操作时需要加上大写参数-R 来表示递归操作,即对目录内所有的文件进行整体操作。

[root@localhost testidr]# ls -l test
-rwxrw---- 1 jingpan root 10 8月  22 10:19 test
[root@localhost testidr]# chown root:bin test
[root@localhost testidr]# ls -l test
-rwxrw---- 1 root bin 10 8月  22 10:19 test

现在,大学里的很多老师都要求学生将作业上传到服务器的特定共享目录中,但总是有
几个“破坏分子”喜欢删除其他同学的作业,这时就要设置 SBIT(Sticky Bit)特殊权限位了
(也可以称之为特殊权限位之粘滞位)。SBIT 特殊权限位可确保用户只能删除自己的文件,而
不能删除其他用户的文件。换句话说,当对某个目录设置了 SBIT 粘滞位权限后,那么该目录
中的文件就只能被其所有者执行删除操作了。
最初不知道是哪位非资深技术人员将 Sticky Bit 直译成了“粘滞位”,刘遄老师建议将其
称为“保护位”,这既好记,又能立刻让人了解它的作用。RHEL 7 系统中的/tmp 作为一个共
享文件的目录,默认已经设置了 SBIT 特殊权限位,因此除非是该目录的所有者,否则无法删
除这里面的文件。
与前面所讲的 SUID 和 SGID 权限显示方法不同,当目录被设置 SBIT 特殊权限位后,文
件的其他人权限部分的 x 执行权限就会被替换成 t 或者 T,原本有 x 执行权限则会写成 t,原
本没有 x 执行权限则会被写成 T。
[root@linuxprobe tmp]# su - linuxprobe
Last login: Wed Feb 11 12:41:20 CST 2017 on pts/0
[linuxprobe@linuxprobe tmp]$ ls -ald /tmp
drwxrwxrwt. 17 root root 4096 Feb 11 13:03 /tmp
[linuxprobe@linuxprobe ~]$ cd /tmp
[linuxprobe@linuxprobe tmp]$ ls -ald
drwxrwxrwt. 17 root root 4096 Feb 11 13:03 .
[linuxprobe@linuxprobe tmp]$ echo "Welcome to linuxprobe.com" > test
[linuxprobe@linuxprobe tmp]$ chmod 777 test
[linuxprobe@linuxprobe tmp]$ ls -al test
-rwxrwxrwx. 1 linuxprobe linuxprobe 10 Feb 11 12:59 test
其实,文件能否被删除并不取决于自身的权限,而是看其所在目录是否有写入权限(其
原理会在下个章节讲到)。为了避免现在很多读者不放心,所以上面的命令还是赋予了这个 test

文件最大的 777 权限(rwxrwxrwx)。我们切换到另外一个普通用户,然后尝试删除这个其他
人创建的文件就会发现,即便读、写、执行权限全开,但是由于 SBIT 特殊权限位的缘故,依
然无法删除该文件:
[root@linuxprobe tmp]# su - blackshield
Last login: Wed Feb 11 12:41:29 CST 2017 on pts/1
[blackshield@linuxprobe ~]$ cd /tmp
[blackshield@linuxprobe tmp]$ rm -f test
rm: cannot remove ‘test’: Operation not permitted
当然,要是也想对其他目录来设置 SBIT 特殊权限位,用 chmod 命令就可以了。对应的
参数 o+t 代表设置 SBIT 粘滞位权限:
[blackshield@linuxprobe tmp]$ exit
Logout
[root@linuxprobe tmp]# cd ~
[root@linuxprobe ~]# mkdir linux
[root@linuxprobe ~]# chmod -R o+t linux/
[root@linuxprobe ~]# ls -ld linux/
drwxr-xr-t. 2 root root 6 Feb 11 19:34 linux/

这篇关于文件的特殊权限 SUID SGID SBIT chmod命令,chown命令的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/896555

相关文章

Spring Security 基于表达式的权限控制

前言 spring security 3.0已经可以使用spring el表达式来控制授权,允许在表达式中使用复杂的布尔逻辑来控制访问的权限。 常见的表达式 Spring Security可用表达式对象的基类是SecurityExpressionRoot。 表达式描述hasRole([role])用户拥有制定的角色时返回true (Spring security默认会带有ROLE_前缀),去

零基础学习Redis(10) -- zset类型命令使用

zset是有序集合,内部除了存储元素外,还会存储一个score,存储在zset中的元素会按照score的大小升序排列,不同元素的score可以重复,score相同的元素会按照元素的字典序排列。 1. zset常用命令 1.1 zadd  zadd key [NX | XX] [GT | LT]   [CH] [INCR] score member [score member ...]

30常用 Maven 命令

Maven 是一个强大的项目管理和构建工具,它广泛用于 Java 项目的依赖管理、构建流程和插件集成。Maven 的命令行工具提供了大量的命令来帮助开发人员管理项目的生命周期、依赖和插件。以下是 常用 Maven 命令的使用场景及其详细解释。 1. mvn clean 使用场景:清理项目的生成目录,通常用于删除项目中自动生成的文件(如 target/ 目录)。共性规律:清理操作

BUUCTF(34)特殊的 BASE64

使用pycharm时,如果想把代码撤销到之前的状态可以用 Ctrl+z 如果不小心撤销多了,可以用 Ctrl+Shift+Z 还原, 别傻傻的重新敲了 BUUCTF在线评测 (buuoj.cn) 查看字符串,想到base64的变表 这里用的c++的标准程序库中的string,头文件是#include<string> 这是base64的加密函数 std::string

利用命令模式构建高效的手游后端架构

在现代手游开发中,后端架构的设计对于支持高并发、快速迭代和复杂游戏逻辑至关重要。命令模式作为一种行为设计模式,可以有效地解耦请求的发起者与接收者,提升系统的可维护性和扩展性。本文将深入探讨如何利用命令模式构建一个强大且灵活的手游后端架构。 1. 命令模式的概念与优势 命令模式通过将请求封装为对象,使得请求的发起者和接收者之间的耦合度降低。这种模式的主要优势包括: 解耦请求发起者与处理者

linux 判断某个命令是否安装

linux 判断某个命令是否安装 if ! [ -x "$(command -v git)" ]; thenecho 'Error: git is not installed.' >&2exit 1fi

jenkins 插件执行shell命令时,提示“Command not found”处理方法

首先提示找不到“Command not found,可能我们第一反应是查看目标机器是否已支持该命令,不过如果相信能找到这里来的朋友估计遇到的跟我一样,其实目标机器是没有问题的通过一些远程工具执行shell命令是可以执行。奇怪的就是通过jenkinsSSH插件无法执行,经一番折腾各种搜索发现是jenkins没有加载/etc/profile导致。 【解决办法】: 需要在jenkins调用shell脚

Linux命令(4):fg与bg命令

fg、bg、jobs、&、ctrl + z都是跟系统任务有关的,虽然现在基本上不怎么需要用到这些命令,但学会了也是很实用的 一.& 最经常被用到 这个用在一个命令的最后,可以把这个命令放到后台执行 二.ctrl + z 可以将一个正在前台执行的命令放到后台,并且暂停 三.jobs 查看当前有多少在后台运行的命令 四.fg 将后台中的命令调至前台继续运行 如果后台中有多个命令,可以

Linux命令(3):sz与rz命令

一般来说,linux服务器大多是通过ssh客户端来进行远程的登陆和管理的,使用ssh登陆linux主机以后,如何能够快速的和本地机器进行文件的交互呢,也就是上传和下载文件到服务器和本地; 与ssh有关的两个命令可以提供很方便的操作: sz:将选定的文件发送(send)到本地机器 rz:运行该命令会弹出一个文件选择窗口,从本地选择文件上传到服务器(receive) rz,sz是便是Linux

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录

Detectorn2预训练模型复现:数据准备、训练命令、日志分析与输出目录 在深度学习项目中,目标检测是一项重要的任务。本文将详细介绍如何使用Detectron2进行目标检测模型的复现训练,涵盖训练数据准备、训练命令、训练日志分析、训练指标以及训练输出目录的各个文件及其作用。特别地,我们将演示在训练过程中出现中断后,如何使用 resume 功能继续训练,并将我们复现的模型与Model Zoo中的