svn更新包装上的setuid无法正常工作?

时间:2011-03-28 11:29:26

标签: svn apache setuid

我有一个属于用户'foo'的svn存储库,可以通过Apache访问,我正在尝试从post-commit钩子上运行svn update,这个目录也是由foo拥有的。

我创建了一个由foo拥有的C包装器,并按http://subversion.apache.org/faq.html#website-auto-update中的建议设置了suid位,然后由用户www-data运行的post-commit脚本调用。

但是,当我从用户www-data(空环境)运行包装器时,它实际上以用户foo的形式调用svn update,但莫名其妙地我被svn提示请求用户www-data的密码。

包装器的代码(称为svnupdater.c)与官方常见问题解答中的建议相同(当然使用正确的路径)。它由用户foo创建和编译。设置suid位后,ls -l inside / hooks显示:

-rwxr-xr-x 1 www-data foo   74 2011-03-28 12:54 post-commit
-rwsr-sr-x 1 foo      foo 7144 2011-03-28 12:16 svnupdater

如果我然后'su www-data'并运行'env - ./svnupdater'(来自sh或bash),ps aux正确显示:

foo   20260  3.7  0.8  14008  4492 pts/0    S+   12:18   0:00 svn update /home/foo/foosvn

但我仍然可以看到svn update提示我:

Authentication realm: <http://xxxxxx> xxxxx
Password for 'www-data':

当然,当提交后调用它时,整个事情都不会起作用。

我似乎无法理解问题出在哪里,因为这个策略是官方建议的,但看起来svn update绕过setuid并仍然使用实际用户...

1 个答案:

答案 0 :(得分:1)

看起来我找到了一个解决方案。

你需要在包装器中添加--config-dir参数(所以看起来像this),因为看起来svn不会从正确的目录中读取auth文件。

我认为这应该记录在Apache faqs中。