الحصول على uid و gid برمجيا من اسم المستخدم في يونيكس؟

StackOverflow https://stackoverflow.com/questions/1009254

سؤال

أحاول استخدام setuid () و setGID () لتعيين المعرف المعني لبرنامج لإسقاط الامتيازات من الجذر ، ولكن لاستخدامها ، أحتاج إلى معرفة UID و GID للمستخدم الذي أريد تغييره إليه.

هل هناك دعوة نظام للقيام بذلك؟ لا أرغب في ترميزه أو تحليله من /etc /passwd.

كما أود أن أفعل هذا برمجيًا بدلاً من استخدام:

id -u اسم المستخدم

أي مساعدة سيكون موضع تقدير كبير

هل كانت مفيدة؟

المحلول

ألق نظرة على getpwnam () و getGrnam () المهام.

نصائح أخرى

تريد استخدام عائلة GETPW* من مكالمات النظام ، بشكل عام في PWD.H. إنها في الأساس واجهة على مستوى C للمعلومات في /etc /passwd.

#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;
}

المرجع: getpwnam () getGrnam ()

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top