У меня есть svn-репозиторий, принадлежащий пользователю 'foo' и доступ к которому осуществляется через Apache, и я пытаюсь запустить svn update из ловушки post-commit для каталога, который также принадлежит foo.
Я создал оболочку C, принадлежащую foo, и установил бит suid, как предложено в http://subversion.apache.org/faq.html#website-auto-update, который затем должен вызываться скриптом post-commit, запускаемым пользователем www-data.
Тем не менее, когда я запускаю оболочку из пользовательских www-данных (с пустой средой), она фактически вызывает svn update как пользователя foo, но необъяснимым образом я получаю приглашение от 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
Если I, то su su-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 подсказывает мне:
Authentication realm: <http://xxxxxx> xxxxx
Password for 'www-data':
И, конечно, все это не будет работать, когда послеcommit вызывает его.
Я не могу понять, в чем проблема, поскольку эта стратегия официально предложена, но похоже, что svn update обходит setuid и все еще использует фактического пользователя..