Linux 是否在ps o/p中错误显示EGID和RGID?

Linux 是否在ps o/p中错误显示EGID和RGID?,linux,bash,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),11

我有这个:

$ 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

ps输出为您提供了一个线索。您正在运行的是bash,将脚本作为参数。因为bash不是suid,所以它不能提升权限

Linux和大多数Unix都不允许使用suid shell脚本。它是作为exec()系统调用的一部分实现的,它们忽略通过#解释的任何内容的suid/sgid!机械装置(请参见
man execve
)。为了解决这个问题,您很可能希望使用sudo,并可能从shell脚本中调用它(无论如何这会更安全)

要使用sudo运行部分脚本,可以使用sudo的-u或-g选项启动脚本。因此,您需要在/etc/sudoers中制定一条规则(这超出了本答案的范围),允许您运行脚本。假设您的脚本是/tmp/script,您是abc。要以用户“sauer”的身份运行该命令而不提示输入密码,您需要将其添加到/etc/sudoers中:

abc ALL = (sauer) NOPASSWD: /tmp/script
并运行此命令

sudo -u sauer /tmp/script
sudo -g admin /tmp/script
要以管理员组成员的身份运行它,您需要添加以下行:

abc ALL = (%admin) NOPASSWD: /tmp/script
并运行此命令

sudo -u sauer /tmp/script
sudo -g admin /tmp/script

阅读sudoers手册页,在Google上搜索更多关于sudo的文档。将用户和组与括号表达式中的逗号组合(即,
(sauer,root,%admin)

ps输出为您提供了线索。您正在运行的是bash,将脚本作为参数。因为bash不是suid,所以它不能提升权限

Linux和大多数Unix都不允许使用suid shell脚本。它是作为exec()系统调用的一部分实现的,它们忽略通过#解释的任何内容的suid/sgid!机械装置(请参见
man execve
)。为了解决这个问题,您很可能希望使用sudo,并可能从shell脚本中调用它(无论如何这会更安全)

要使用sudo运行部分脚本,可以使用sudo的-u或-g选项启动脚本。因此,您需要在/etc/sudoers中制定一条规则(这超出了本答案的范围),允许您运行脚本。假设您的脚本是/tmp/script,您是abc。要以用户“sauer”的身份运行该命令而不提示输入密码,您需要将其添加到/etc/sudoers中:

abc ALL = (sauer) NOPASSWD: /tmp/script
并运行此命令

sudo -u sauer /tmp/script
sudo -g admin /tmp/script
要以管理员组成员的身份运行它,您需要添加以下行:

abc ALL = (%admin) NOPASSWD: /tmp/script
并运行此命令

sudo -u sauer /tmp/script
sudo -g admin /tmp/script


阅读sudoers手册页,在Google上搜索更多关于sudo的文档。在插入式表达式(即,
(sauer,root,%admin)
)中将用户和组与逗号组合起来。

编写安全shell脚本非常困难。想想
$PATH
$IFS
。。。因此,Linux不尊重shell脚本的setuid/setgid位。

编写安全的shell脚本真的很难。想想
$PATH
$IFS
。。。因此,Linux不支持shell脚本的setuid/setgid位。

@danny谢谢!但我把/bin/bash改成了sgid。但是o/p与我上面描述的没有变化。@danny我不明白你在第二段回答中的意思。你能举个例子吗?首先,作为一名安全专业人士,我对在bash上更改权限以包含sgid的想法感到震惊。:)但无论如何。。。尝试运行/bin/bash/path/to/script,而不是直接运行脚本,看看这是否会改变行为。我认为“ignore setid”逻辑在exec中,由#触发!机制,所以您可能会发现运行sgid bash会直接改变行为。在第二段中,您是指“解释exec()的功能”还是“我将如何使用sudo实现此功能”@dannysauer:我希望
bash script.sh
也会放弃特权,除非您将
-p
开关传递给它。@danny谢谢!但我把/bin/bash改成了sgid。但是o/p与我上面描述的没有变化。@danny我不明白你在第二段回答中的意思。你能举个例子吗?首先,作为一名安全专业人士,我对在bash上更改权限以包含sgid的想法感到震惊。:)但无论如何。。。尝试运行/bin/bash/path/to/script,而不是直接运行脚本,看看这是否会改变行为。我认为“ignore setid”逻辑在exec中,由#触发!机制,因此您可能会发现运行sgid bash会直接改变行为。在第二段中,您是指“解释exec()的功能”还是“我将如何使用sudo实现此功能”@dannysauer:我希望
bash script.sh
也会放弃特权,除非您将
-p
开关传递给它。“Linux不尊重shell脚本的setuid/setgid位。”这条笼统的语句总是正确的吗?我正在运行Ubuntu 10.04。@abc:是的,请查看系统上execve()的手册页。您将看到“Linux忽略脚本上的SUID和SGID位。”在“注释:man execve”下,“Linux忽略脚本上的设置用户ID和设置组ID位”。“正确;只有以#开头的可执行文件才忽略位/path/to/解释器“Linux不尊重shell脚本的setuid/setgid位。”这条笼统的语句总是正确的吗?我正在运行Ubuntu10.04。@abc:是的,请查看您系统上execve()的手册页。您将看到“Linux忽略脚本上的SUID和SGID位。”在NOTES:man execve下,“Linux忽略脚本上的设置用户ID和设置组ID位。”正确;只有以#开头的可执行文件才忽略位/路径/到/解释器