EGID和RGID在ps o / p中显示不正确?

问题描述

| 我有这个:
$ 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,eus  1001 abc     1001 abc     1001 abc     1001 abc      0 pts/2    abc
    

解决方法

        编写安全的Shell脚本真的很难。考虑一下
$PATH
$IFS
...。因此,Linux不支持shell脚本的setuid / setgid位。     ,        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
要将其作为admin组的成员运行,您需要添加以下行:
abc ALL = (%admin) NOPASSWD: /tmp/script
并运行此命令
sudo -g admin /tmp/script
阅读sudoers手册页并在Google周围浏览,以找到有关sudo的更多文档。您可以在该括号表达式(即
(sauer,root,%admin)
)中将用户和用户组与逗号结合起来