用所有者的权限运行一个shell脚本

Debian(5.0.3)服务器上,我有一个拥有某个shell脚本的用户svnsync

 -rwsrwsr-x 1 svnsync users 119 Dec 21 13:45 mirror-svn.sh 

我希望users组中的每个人都能够使用svnsync的特权执行此脚本。 这与触发post-commit脚本中的“ svnsync synchorize ”命令有关; 引用svnbook :

您可能希望您的主存储库将更改推送到一个或多个有福的镜像,作为其提交后和修订后的更改挂接实现的一部分。 这将使镜子尽可能接近实时地最新。

无论如何,我不能得到SUID的工作,显然是因为Linux / Debian是这里提到的现代Unix系统之一:

由于这个原因,一些现代UNIX系统忽略了shell脚本上的SUID和SGID位。

这个SF问题提出了同样的问题:“你不能使用SUID根目录作为shell脚本”。 所以,这是我的后续问题:

如果我真的想用自己的主人的特权来运行一个脚本,不pipe任何潜在的风险,是否有任何无忧的方法来做到这一点? build议将脚本编译为二进制文件,但如果可能的话,我宁愿采用更简单的方法。 如何从例如一个Perl脚本调用shell脚本(我实际上尝试过,但不能得到它的工作)? 添加每个人sudoers文件也不是一个很好的select。

更新 :得到它通过安装perl-suid工作, build议使用0x89,并使用像下面的Perl包装脚本。

 #!/usr/bin/suidperl -T $ENV{PATH} = "/bin:/usr/bin"; system("/path/to/mirror-svn.sh"); 

在这个包装脚本上设置chmod +s 。 还要注意$ENV{PATH}需要在脚本中设置; 否则你会得到一个抱怨,这是不安全的 。

在较新版本的debian上,有一个名为perl-suid的包,它为perl脚本提供了这个问题,也许它在5.0.3中也是可用的。

给脚本SUID位的安全问题不仅限于shell脚本,还会影响任何解释型语言。 这就是为什么你最初尝试从Perl调用脚本不起作用。 似乎可以在solaris上的脚本中设置SUID位,但是我猜你不想在脚本上编写C封装,迁移到solaris不是你的select吗? ;-)。