我有一个特权 C 程序,由标准用户(例如)执行,stduser
并在执行时切换到系统用户(例如sysuser
),如下所示。基本上,我正在尝试做一些类似于sudo -u sysuser env
会做的事情。
环境测试.c:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<sys/types.h>
#include<unistd.h>
#include<errno.h>
#include<shadow.h>
#include<pwd.h>
int main(void){
struct passwd*pw;
uid_t sysuid;
gid_t sysgid;
char err_module_name[256] = "";
pw = getpwnam ("ayauser");
endpwent();
if (!pw){ //user doesn't really exist
perror("getpwnam()");
return errno;
}
sysuid = pw->pw_uid;
sysgid = pw->pw_gid;
(strcpy(err_module_name, "setregid()") == NULL || setregid(sysgid, sysgid) == 0) &&
(strcpy(err_module_name, "setreuid()") == NULL || setreuid(sysuid, sysuid) == 0) &&
(strcpy(err_module_name, "execl()") == NULL || execl("/usr/bin/env", "/usr/bin/env", NULL) == 0);
perror(err_module_name);
return errno;
}
我已经做好了:
$ sudo chgrp root envtest
$ sudo chown root envtest
$ chmod 6555 envtest
之后,当我运行该envtest
程序时,它显示相同的环境变量stduser
not sysuser
。即env
command和command的输出envtest
是一样的。正如我所期望的,输出应该与sudo -u sysuser env
.
代码中缺少什么?如何修改程序以具有与设置相同的环境变量sysuser
?
答案1
什么sudo -i
是:
-i, --login
运行由目标用户的密码数据库条目指定的 shell 作为登录 shell。这意味着shell 将读取特定于登录的资源文件(例如
.profile
或 ) 。.login
最后一点很重要,shell 读取许多启动文件(取决于它们的启动方式,请参见例如Bash 的手册对此进行了说明)。您的程序不会读取这些文件,因此它看不到其中的变量分配。