표준 사용자(예:)에 의해 실행되고 아래와 같이 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 매뉴얼은 이것을 설명합니다). 귀하의 프로그램은 이러한 파일을 읽지 않으므로 해당 파일의 변수 할당을 볼 수 없습니다.