如何在 C 中的 setregid() 和 setreuid() 之后访问/设置其他用户的环境变量

如何在 C 中的 setregid() 和 setreuid() 之后访问/设置其他用户的环境变量

我有一个特权 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程序时,它显示相同的环境变量stdusernot sysuser。即envcommand和command的输出envtest是一样的。正如我所期望的,输出应该与sudo -u sysuser env.

代码中缺少什么?如何修改程序以具有与设置相同的环境变量sysuser

答案1

什么sudo -i是:

-i, --login

运行由目标用户的密码数据库条目指定的 shell 作为登录 shell。这意味着shell 将读取特定于登录的资源文件(例如.profile或 ) 。.login

最后一点很重要,shell 读取许多启动文件(取决于它们的启动方式,请参见例如Bash 的手册对此进行了说明)。您的程序不会读取这些文件,因此它看不到其中的变量分配。

相关内容