我有一个git仓库,需要以sudo身份运行post-receive hook。 我编译的测试二进制文件如下:
#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()
函数检索了post-receive
的所有者id,然后尝试设置uid。在任何用户(包括超级用户)下执行此操作时,它会以root身份正确运行脚本。但是,在由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)。
ssh hostname 'cd /path/to/repo; .git/hooks/post-receive'
。 - Cascabel