如何解决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)
)中将用户和用户组与逗号结合起来
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。