【发布时间】:2010-12-09 12:28:32
【问题描述】:
我编写的 Python 扩展需要 root 访问权限才能执行单个硬件初始化调用。我宁愿不为我的扩展程序中的这个调用以 root 身份运行整个脚本,所以我想编写一个包装器来执行此初始化,然后再降低到用户权限并运行实际脚本。
我打算通过sudo 运行这个包装器,例如
$ sudo devwrap python somescript.py
我正在考虑类似(更新以修复几个错误):
int main(int argc, char * argv[])
{
if(argc < 2) return 0;
int res = do_hardware_init();
if(res != OK_VALUE)
{
// Print error message
return HW_ERR;
}
const char *sudo_uid = getenv("SUDO_UID");
if(sudo_uid)
{
int real_uid = (int) strtol(sudo_uid, NULL, 0);
setuid(real_uid);
}
return execvp(argv[1], &argv[1]); // No return if successful
}
所以我有三个问题:
- 这看起来很正常吗?我通常不需要弄乱 *uid() 调用,所以我不熟悉常见的陷阱。
execvp调用也看起来有点奇怪,但据我所知,它在正确的位置有参数)。 -
execvp手册页说 “应用程序不应直接访问 environ 数组” - 这是否使调用getenv成为一个坏主意? - 有没有比
execvp更好的调用,所以我可以调用sudo devwrap somescript.py(注意没有“python”)
【问题讨论】: