ユーザー「foo」に属し、Apacheを介してアクセスされるsvnリポジトリがあり、同じくfooが所有するディレクトリで、post-commitフックからsvnupdateを実行しようとしています。
http://subversion.apache.org/faq.html#website-auto-updateで提案されているように、fooが所有するCラッパーを作成し、suidビットを設定しました。これは、コミット後のスクリプトによって呼び出されます。ユーザーwww-dataによる。
それでも、(空の環境で)ユーザーwww-dataからラッパーを実行すると、実際にはユーザーfooとしてsvn updateが呼び出されますが、不可解なことに、ユーザーwww-dataのパスワードを要求するsvnによってプロンプトが表示されます。
svnupdater.cと呼ばれるラッパーのコードは、公式のよくある質問で提案されているものと同じです(もちろん正しいパスを使用しています)。これは、ユーザーfooによって作成およびコンパイルされます。suidビットを設定した後、/hooks内のls-lが表示されます。
-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から)を実行すると、psauxは正しく次のように表示されます。
foo 20260 3.7 0.8 14008 4492 pts/0 S+ 12:18 0:00 svn update /home/foo/foosvn
しかし、それでも私はsvnupdateが私に次のように促しているのを見ることができます:
Authentication realm: <http://xxxxxx> xxxxx
Password for 'www-data':
そしてもちろん、ポストコミットがそれを呼び出すとき、すべてが機能するわけではありません。
この戦略は公式に提案されたものであるため、問題がどこにあるのか本当に理解できないようですが、svn updateはsetuidをバイパスし、実際のユーザーを使用しているようです...