Shell编程 之 对setuid的误解

1.setuid的作用
我们知道当给一个命令赋予了setuid权限之后,那么用户在执行这个命令时便暂时拥有了该
命令所有者的权限,也就是说,不管是谁执行的此命令,都是以该命令所有者的身份执行的。
在Linux系统中,最明显的一个例子就是passwd这个命令。

我们查看/etc/shadow这个文件的权限如下:

$ ls -l /etc/shadow
-rw-r----- 1
root shadow 1186 2012-03-09 11:35 /etc/shadow

我们可以看出/etc/shadow这个文件只有root用户可以写,shadow组的用户只能读,其他用
户没有任何权限。

但是每一个用户都可以通过passwd这个命令修改自已的密码,这又是为什么呢?

我们看一下passwd这个命令的属性:

$ ls -l /usr/bin/passwd
-rwsr-xr-x 1
root root 42856 2011-02-15 06:11 /usr/bin/passwd

我们注意到passwd这个命令的属性中有一个s位,这就是普通用户能够修改自已的密码
的原因。
passwd这个命令具有setuid权限且其属主是root,所以其他用户在用此命令修改密码时,实
际上是以root的身份修改的密码。

我们可以做个实验验证一下。把passwd命令的s位去掉,看普通用户还能否修改自已的密码。

$ sudo chmod u-s /usr/bin/passwd
$
ls -l
/usr/bin/passwd
-rwxr-xr-x 1
root root 42856 2011-02-15 06:11 /usr/bin/passwd
$
passwd wlxxsj
更改 wlxxsj 的密码。
(当前)UNIX 密码:
输入新的 UNIX 密码:
重新输入新的
UNIX 密码:
passwd:认证令牌操作错误
passwd:
password unchanged

从上面的实验可以看出,当把passwd这个命令的s位去掉后,普通用户便无法修改自已的密码了。

2.
对setuid的误用

下面说一下我对setuid的一个误用。还是通过一个实验来说明。

先建立一个文件夹和两个文件,它们的关系及属性如下图所示:

其中rmtest.sh是一个shell脚本,作用是删除同目录下的rmtest.txt这个文件。

文件夹setuid,文件rmtest.sh和rmtest.txt的属主和属组都是root。

rmtest.sh具有setuid权限。

我期望的是,当用普通用户执行rmtest.sh这个脚本的时候,能够删除rmtest.txt这个文件。但是删除失败。

再来做个实验。

把rmtest.sh的s位去掉,给rm这个命令添加s位,然后用普通用户执行rmtest.sh这个脚本,rmtest.txt这个文件被成功删除。

3.
总结

我对setuid的误解:

当给一个脚本赋予了setuid权限后,脚本中的命令就会以脚本的身份执行。这是错误的。

应该这么理解:

setuid只对命令有效,对脚本无效。或者说只对原子操作(系统命令)有效,对组合操作(用户脚本)无效,除非脚本中

所用到的命令都具有setuid权限且与脚本同属主。

来自为知笔记(Wiz)

Shell编程 之 对setuid的误解,码迷,mamicode.com

时间: 2024-11-04 21:58:59

Shell编程 之 对setuid的误解的相关文章

Linux Unix shell 编程指南学习笔记(第一部分)

第一章:文件安全与权限: 1.文件和目录的权限 创建文件时系统保存了文件所有相关的信息,包括 文件的位置 . 文件类型 . 文件长度 . 哪位用户拥有该文件,哪些用户可以访问该文件 . i 节点 . 文件的修改时间 . 文件的权限位 . 文件类型: d: 目录 l : 符号链接(指向另一个文件) s: 套接字文件 b: 块设备文件 c: 字符设备文件 p: 命名管道文件 -: 不属于上述类型的文件 文件权限 XXX       XXX        XXX 最左边 XXX : 文件属主 权限位

Shell编程 之 条件表达式

1 #!/bin/bash -   2 #===============================================================================  3 #  4 #          FILE: condition_expression_test.sh  5 #   6 #         USAGE: ./condition_expression_test.sh   7 #   8 #   DESCRIPTION:   9 #  10 #

老男孩新书Shell编程实战预定开始了-包邮包答疑

老男孩新书Shell编程实战预定开始了(扫图中二维码购买包邮定期包答疑),亲爱的伙伴们,让你们久等了.电脑用户猛戳 电脑购买链接 注意:包邮包3个月(2017春节后起算)Q群书籍内容答疑,等于白送书,还倒搭答疑服务. 如果觉得给力,请帮忙朋友圈.QQ群.空间转载! 活动优惠仅限本次活动,从其他渠道购买不享受此次的服务承诺. 定价 89元 基本信息 作者: 老男孩 丛书名: Linux/Unix技术丛书 出版社: 机械工业出版社 ISBN:9787111556077 上架时间:2017-1-6 出

shell编程中for,while,util,case,select,break, continue用法详解

关于shell脚本的更多详细实例讲解请参考:http://www.cnblogs.com/yuexiaxiaoxi/category/646749.html Shell编程中循环命令用于特定条件下决定某些语句重复执行的控制方式,有三种常用的循环语句:for.while和until.while循环和for循环属于"当型循环",而until属于"直到型循环".循环控制符:break和continue控制流程转向. 参考:<Linux 与unix shell 编程指

shell编程(七)--- sed的用法

sed:称为流编辑器,也称为行编辑器. sed处理过程:sed读取源文件中的一行,并将其放在临时缓冲区中,这个缓冲区称为模式空间,使用相应的模式对模式空间进行处理,并将处理的结果显示到屏幕上,并不会影响源文件,处理结束后,将模式空间中的内容显示至屏幕. sed格式: sed [options] 'AddressCommand' file ... options: -n:静默模式,不显示模式空间中的内容,默认显示默认空间中的内容.常和p命令一起使用. -i:直接修改源文件的内容. -e 'Addr

shell编程基础必知

shell编程 ################################################ 静态语言 动态语言 ################################################ 编程语言:机器语言,汇编语言,高级语言 ################################################ 面向对象的编程语言:sehll c 面向对象的编程语言:JAVA Python perl c++ ################

shell编程详解(一)

shell编程 语言分为: 编译型语言:先要事先转换成可执行格式 解释型语言:边解释边执行 变量:shell是弱类型编程语言,变量不需要先指明类型及初始化,而是由上下文决定类型 bash变量类型: 环境变量 本地变量 位置变量 特俗变量 本地变量:作用域为整个bash进程 VARNAME=value 局部变量:作用域当前代码 local VARNAME=value 环境变量:作用域为当前shell进程及子进程 export VARNAME=value 条件判断 hash中如何实现条件判断? 条件

linux shell编程

1.什么是shell 2. 还是hello world程序 3. shell中的变量 3.1 系统变量 3.2 用户定义变量 3.2.1 用户定义变量规则 3.2.3 shell如何使用变量 3.2.3 全局变量 vs 局部变量 4. shell编程中的控制结构 4.1 条件判定 4.1.1 简单条件判定 4.1.2 组合判定 4.2  if - else 4.3 for 4.4 while 4.5 case 5. shell中的函数 5.1 函数声明和定义 5.2 函数调用 6. shell脚

centos shell编程4【分发系统】 第三十八节课

centos shell编程4[分发系统]  第三十八节课 http://www.cnblogs.com/MYSQLZOUQI/p/4811790.htmlmkpasswd 生成密码的工具,安装 expect包 yum install -y expect 上半节课 下半节课 f