Unix의 사용자 이름에서 프로그래밍 방식으로 UID와 GID를 얻습니까?
-
06-07-2019 - |
문제
나는 setuid () 및 setgid ()를 사용하여 프로그램의 각 ID를 루트에서 내려 놓기 위해 권한을 떨어 뜨리려면 변경하려는 사용자의 UID와 GID를 알아야합니다.
이 작업을 수행하는 시스템 호출이 있습니까? 나는 그것을 하드 코딩하거나 /etc /passwd에서 구문 분석하고 싶지 않습니다.
또한 사용하기보다는 프로그래밍 방식 으로이 작업을 수행하고 싶습니다.
id -u 사용자 이름입니다
모든 도움은 대단히 감사하겠습니다
해결책
살펴보십시오 getpwnam () 그리고 getgrnam () 기능.
다른 팁
일반적으로 getpw* 시스템 통화 제품군을 사용하고 싶습니다. pwd.h. 기본적으로 /etc /passwd의 정보에 대한 C 수준의 인터페이스입니다.
#include <sys/types.h>
#include <pwd.h>
#include <stdlib.h>
#include <unistd.h>
#include <stdio.h>
int main()
{
char *username = ...
struct passwd *pwd = calloc(1, sizeof(struct passwd));
if(pwd == NULL)
{
fprintf(stderr, "Failed to allocate struct passwd for getpwnam_r.\n");
exit(1);
}
size_t buffer_len = sysconf(_SC_GETPW_R_SIZE_MAX) * sizeof(char);
char *buffer = malloc(buffer_len);
if(buffer == NULL)
{
fprintf(stderr, "Failed to allocate buffer for getpwnam_r.\n");
exit(2);
}
getpwnam_r(username, pwd, buffer, buffer_len, &pwd);
if(pwd == NULL)
{
fprintf(stderr, "getpwnam_r failed to find requested entry.\n");
exit(3);
}
printf("uid: %d\n", pwd->pw_uid);
printf("gid: %d\n", pwd->pw_gid);
free(pwd);
free(buffer);
return 0;
}
getpwnam과 struct passwd를보십시오.
다음 코드 스 니펫을 사용할 수 있습니다.
#include <pwd.h>
#include <grp.h>
gid_t Sandbox::getGroupIdByName(const char *name)
{
struct group *grp = getgrnam(name); /* don't free, see getgrnam() for details */
if(grp == NULL) {
throw runtime_error(string("Failed to get groupId from groupname : ") + name);
}
return grp->gr_gid;
}
uid_t Sandbox::getUserIdByName(const char *name)
{
struct passwd *pwd = getpwnam(name); /* don't free, see getpwnam() for details */
if(pwd == NULL) {
throw runtime_error(string("Failed to get userId from username : ") + name);
}
return pwd->pw_uid;
}
ref : getpwnam () getgrnam ()
제휴하지 않습니다 StackOverflow