post-receive フックを sudo として実行する必要がある git リポジトリがあります。これをテストするためにコンパイルしたバイナリは次のようになります。
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main() {
int ret;
ret = setuid(geteuid());
if(!ret) {
fprintf(stderr, "error setting uid %d \n", ret);
}
system("[...command only sudo can access...]");
return 0;
}
はのgeteuid()
所有者 ID を取得し、post-receive
setuid を試みます。これを任意のユーザー(スーパーユーザーを含む)で実行すると、スクリプトがルートとして正しく実行されます。ただし、git フックによってトリガーされると、システムは uid の設定に失敗します。実行してみchmod u+s post-receive
ましたが、他の構成もいくつか試しましたが、アイデアが不足しています。git がトリガーする場合を除いて、すべてのケースで機能する理由はありますか?
ところで、プラットフォーム Ubuntu Server 9.04(2.6.28-15)、git1.6.0.4、gcc バージョン 4.3.3 (Ubuntu 4.3.3-5ubuntu4)