在ps o / p中错误地显示EGID和RGID?

时间:2011-05-31 20:56:06

标签: linux bash

我有这个:

$ 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

2 个答案:

答案 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)