关于shell脚本设置SUID的问题。

我写了个脚本quit.sh,如下:
  1 #/bin/bash
  2 if [ $# -lt 1 ];then
  3   echo"You must input at least one parameter!"
  4   exit 1
  5 fi
  6
  7 if [ $1 == "q" ];then
  8   echo "quit!"
  9   echo "$(whoami) quit @ $(date)">> /tmp/quit.txt      #这里访问了quit.txt
10   exit 0
11 else
12   echo "wrong input!"
13   exit 2
14 fi
   
    我将quit.txt的权限锁住,只有root可以读写,将quit.sh的用户和组都设置为root,并为其设置了SUID,希望其他用户可以通过该脚本读写quit.txt。但是执行起来却是Permission denied,请问这是为啥?
    执行过程如下:

[[email protected](none) tmp]# ll quit.txt
-rw-------. 1 root root 0 Jan 26 23:29 quit.txt
[[email protected](none) tmp]# ll quit.sh
-rwsr-xr-x. 1 root root 228 Jan 26 23:29 quit.sh
[[email protected](none) tmp]# ./quit.sh q                           ----->此处root执行正常
quit!
[[email protected](none) tmp]# cat quit.txt
root quit @ Tue Jan 26 23:31:15 PST 2016
[[email protected](none) tmp]# su - tom                             ------>切换到tom用户
[[email protected](none) ~]$ cd /tmp/
[[email protected](none) tmp]$ ./quit.sh q                          ------->这时候tom执行,进程的属主和属组应该是root,应该可以访问quit.txt才对,但是却提示没有权限
quit!
./quit.sh: line 9: /tmp/quit.txt: Permission denied

经多方查证,发现为shell脚本设置SUID是无效的:

尽管可以对 shell 脚本设置 suid 和 sgid 权限,但是大部分现代 shell 都会对脚本忽略这些位的设置。因为shell 是一种功能非常强大的脚本语言,拥有解释和执行任意表达式的能力。这些特性允许的限制太过宽泛,这就使环境变得非常不安全。因此,如果您对一个 shell 脚本设置了 suid 或 sgid 权限,就不要期望脚本在执行时能够遵守这些设置。

时间: 2024-08-08 15:06:43

关于shell脚本设置SUID的问题。的相关文章

如何将shell脚本设置为开机启动?

1.先新建一个test.sh 的脚本,给a+x权限,然后添加# chkconfig: ? 2345 50 502.chkconfig --add test3.systemctl enable test 其中2345是默认启动级别,级别有0-6共7个级别. ? 等级0表示:表示关机 ? 等级1表示:单用户模式 ? 等级2表示:无网络连接的多用户命令行模式 ? 等级3表示:有网络连接的多用户命令行模式 ? 等级4表示:不可用 ? 等级5表示:带图形界面的多用户模式 ? 等级6表示:重新启动 ? 15

shell 脚本实战笔记(3)--集群机器的时间同步设置

背景: 有些分布式服务(比如HBase服务), 依赖于系统时间戳, 如果集群各个节点, 系统时间不一致, 导致服务出现诡异的情况. 解决方案: 那如何同步集群各个节点之间的时间? 采用NTP(Network Time Protocol)方式来实现, 选择一台机器, 作为集群的时间同步服务器, 然后分别配置服务端和集群其他机器 1.NTP服务端 *) 安装ntp服务 yum install ntp *) 配置/etc/ntp.conf 这边采用本地机器作为时间的原点 注释server列表 #ser

使用shell脚本调用mysql数据库存储过程,并设置定时任务

本来是要mysql数据库中创建事件任务来,定时执行存储过程,做数据传输的...后来由于种种原因,就使用crontab来定时执行,调用存储过程. 实现这个数据传输分为两步: 第一步:编写shell脚本调用mysql数据库存储过程,如下: #!/bin/bash#0 1 * * * sh /home/drmTrans3/rj_proc.shhost1=127.0.0.1user=systempasswd=linuxport=3306mysql -h${host1} -u${user} -p${pas

mac设置shell脚本开机自启动

最近需要做分布式架构的网站,目前一直在调试阶段,每次开机的时候都要启动一大堆工具,比如zookeeper.activemq.redis.nginx等等,不厌其烦. 在网上搜了下mac如何设置shell脚本开机自启动,记录一下,方便自己也方便大家. 1.首先写一个sh脚本,比如: 1 cd ~/Documents 2 mkdir haha 代码很简单,进入Documents文件夹,建立haha目录,保存为run.sh 2.修改run.sh权限 sudo chmod 777 run.sh 3.右键点

(转)通过shell脚本实现批量添加用户和设置随机密码以及生产环境如何批量添加

通过shell脚本实现批量添加用户和设置随机密码以及生产环境如何批量添加 原文:http://www.21yunwei.com/archives/4773 有一个朋友问我如何批量创建用户和设置密码 ,我就简单给他写了两个脚本,让他自己参考下并自己根据实际情况进行修改,毕竟他需要的用户名和密码都是实际生产环境的. 这里分两种情况,一种是测试for循环批量添加用户,一个是根据实际生产环境进行批量添加.分别写一下案例如下:1,for添加指定类型用户以及设置随机密码.脚本作用:批量添加user1-10用

设置IP地址shell脚本

#!/bin/bash A="IPADDR.*" B="NETMASK.*" C="GATEWAY.*" D="DNS1.*" E="/etc/sysconfig/network-scripts/ifcfg-eth1" F="cat $E | sed -n '/BOOTP/p'" if [ ! "$F" = "BOOTPROTO=dhcp" ] t

shell脚本扩展

一.正则表达式: 正则表达式(或称Regular Expression,简称RE)就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式.该模式描述在查找文字主体时待匹配的一个或多个字符串. 正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配.简单的说,正则表示式就是处理字符串的方法,它是以行为单位来进行字符串的处理行为,正则表达式通过一些特殊符号的辅助,可以让使用者轻易的达到搜寻/删除/取代某特定字符串的处理程序.vim.grep.find.awk.sed等

8.11_Linux之bash shell脚本编程入门篇(一)

什么是bash shell脚本编程? 答:Linux里面有多种shell,而CentOS和redhat的默认shell是bash shell.至于shell脚本,这个跟windows操作系统里面的批处理文件有点像(.bat的文件).不知道大家还是否记得Linux的哲学思想吗?其中有那么两点点:由众多目的的单一应用程序组成:一个程序只做一件事,且做好:组合目的的单一的小程序完成复杂的任务.我觉得shell脚本编程就很好的体现了这个哲学思想.shell脚本利用shell的功能缩写的一个"程序&quo

shell脚本教程

http://www.runoob.com/linux/linux-shell.html Shell 传递参数 另外,还有几个特殊字符用来处理参数: 参数处理 说明 $# 传递到脚本的参数个数 $* 以一个单字符串显示所有向脚本传递的参数 $$ 脚本运行的当前进程ID号 $! 后台运行的最后一个进程的ID号 [email protected] 与$*相同,但是使用时加引号,并在引号中返回每个参数. $- 显示Shell使用的当前选项,与set命令功能相同. $? 显示最后命令的退出状态.0表示没