C에서 setregid() 및 setreuid() 이후에 다른 사용자의 환경 변수에 액세스/설정하는 방법

C에서 setregid() 및 setreuid() 이후에 다른 사용자의 환경 변수에 액세스/설정하는 방법

표준 사용자(예:)에 의해 실행되고 아래와 같이 stduser실행 시 시스템 사용자(예:)로 전환되는 권한 있는 C 프로그램이 있습니다 . 기본적으로 저는 앞으로 할 일과 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변수가 표시됩니다 sysuser. 즉, env명령과 명령의 출력은 envtest동일합니다. 예상한 대로 출력은 sudo -u sysuser env.

코드에 무엇이 빠졌나요? set 과 동일한 환경 변수를 갖도록 프로그램을 수정하려면 어떻게 해야 합니까 sysuser?

답변1

무엇 sudo -i인가요:

-i, --login

대상 사용자의 비밀번호 데이터베이스 항목에 지정된 쉘을 로그인 쉘로 실행합니다. 이는 쉘이 로그인별 리소스 파일(예: 또는 )을 읽는다는 의미입니다 .profile..login

마지막으로 중요한 점은 쉘이 많은 시작 파일을 읽는다는 점입니다(시작 방법에 따라 다름).Bash 매뉴얼은 이것을 설명합니다). 귀하의 프로그램은 이러한 파일을 읽지 않으므로 해당 파일의 변수 할당을 볼 수 없습니다.

관련 정보