0

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

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

尽管如此,当我从用户 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 并且仍然使用实际用户......

4

1 回答 1

1

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

您需要在包装器中添加 --config-dir 参数(因此看起来像这样),因为它看起来 svn 不会从正确的目录中读取身份验证文件,否则。

我认为这应该记录在 Apache 常见问题解答中。

于 2011-03-28T16:14:27.277 回答