我有这个:
$ ls -l test1.sh
-rwxr-sr-x 1 root root 24 2011-05-31 13:27 test1.sh # sgid root
$ id
uid=1001(abc) gid=1001(abc) groups=4(adm),6(disk),20(dialout),21(fax),24(cdrom),26(tape),29(audio),30(dip),44(video),46(plugdev),104( fuse),106(lpadmin),112(netdev),121(admin),122(sambashare),1001(abc),1002(sbox)
但是,当我运行test1.sh时,我没有看到有效的组所有者是ps o / p中的root ...为什么?
$ ps -o pid,ppid,cmd,euid,euser,ruid,ruser,egid,egroup,rgid,rgroup,nice,tty,user
PID PPID CMD EUID EUSER RUID RUSER EGID EGROUP RGID RGROUP NI TT USER
8793 2349 bash 1001 abc 1001 abc 1001 abc 1001 abc 0 pts/2 abc
8865 8793 /bin/bash ./test1.sh 1001 abc 1001 abc 1001 abc 1001 abc 0 pts/2 abc
8866 8865 sleep 60 1001 abc 1001 abc 1001 abc 1001 abc 0 pts/2 abc
8868 8793 ps -o pid,ppid,cmd,euid,eus 1001 abc 1001 abc 1001 abc 1001 abc 0 pts/2 abc
答案 0 :(得分:3)
编写安全的shell脚本确实很难。考虑$PATH
,$IFS
,...因此,Linux不尊重shell脚本的setuid / setgid位。
答案 1 :(得分:2)
ps输出为您提供线索。你正在运行的是用脚本作为参数的bash。由于bash不是suid,因此无法提升权限。
Linux - 以及大多数unix - 不允许suid shell脚本。它是作为exec()系统调用的一部分实现的,它们忽略了通过#解释的任何内容的suid / sgid!机制(见man execve
)。要解决这个问题,你很可能想要使用sudo并且可能在你的shell脚本中调用它(无论如何它都更安全)。
要使用sudo运行部分脚本,您可以使用-u或-g选项sudo来启动脚本。因此,您可以在/ etc / sudoers中制定规则(这超出了本答案的范围),允许您运行脚本。假设你的脚本是/ tmp / script,那你就是abc。要在没有提示输入密码的情况下以用户“sauer”运行该命令,您可以将其添加到/ etc / sudoers:
abc ALL = (sauer) NOPASSWD: /tmp/script
并运行此命令
sudo -u sauer /tmp/script
要将其作为管理员组的成员运行,您需要添加以下行:
abc ALL = (%admin) NOPASSWD: /tmp/script
并运行此命令
sudo -g admin /tmp/script
阅读sudoers手册页并浏览Google以查找有关sudo的更多文档。您在该括号表达式中将用户和组与逗号组合在一起(即(sauer,root,%admin)
)