【发布时间】:2010-11-24 20:44:27
【问题描述】:
我有一个 git 存储库,它需要以 sudo 的形式运行接收后挂钩。我为测试而编译的二进制文件如下所示:
#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,然后尝试 setuid。使用任何用户(包括超级用户)运行此脚本时,它会以 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)
【问题讨论】:
-
你有没有想过这个问题?
-
一个问题是您打印了一条错误消息,但随后继续执行 system() 调用。您还会忽略 system() 调用的结果,然后以成功 (0) 状态退出。
-
@Blake:“-as the- with any user”位不清楚-当以您推送的用户身份运行时,程序是否正确运行?我认为复制 git 运行的环境的最接近方法是:
ssh hostname 'cd /path/to/repo; .git/hooks/post-receive' -
为什么不让用户直接用sudo运行命令(用visudo配置,指定'NOPASSWD:')?编写自己的 suid-root 包装器是有风险的。
-
如果您希望挂钩以提升的权限运行,我认为您遇到了设置问题。您最好重新考虑文件所有权和权限。
标签: c++ git ubuntu permissions setuid