我有一个属于用户 '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 并且仍然使用实际用户......