【发布时间】:2011-03-28 11:29:25
【问题描述】:
我有一个属于用户 'foo' 并通过 Apache 访问的 svn 存储库,我正在尝试从 post-commit 挂钩运行 svn update,该目录也属于 foo。
按照http://subversion.apache.org/faq.html#website-auto-update 中的建议,我创建了一个由 foo 拥有的 C 包装器并设置了 suid 位,然后应该由用户 www-data 运行的提交后脚本调用该位。
不过,当我从用户 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 并且仍然使用实际用户......
【问题讨论】: