Question

J'essaie d'utiliser setuid () et setgid () pour définir les identifiants respectifs d'un programme afin qu'ils suppriment les privilèges de la racine, mais pour les utiliser, j'ai besoin de connaître les identificateurs d'utilisateur et de groupe que je souhaite modifier. à.

Existe-t-il un appel système pour le faire? Je ne veux pas le coder en dur ni analyser depuis / etc / passwd.

J'aimerais aussi le faire par programme plutôt que d'utiliser:

id -u USERNAME

Toute aide serait grandement appréciée

Était-ce utile?

La solution

Consultez les getpwnam () et getgrnam () fonctions.

Autres conseils

Vous souhaitez utiliser la famille d'appels système getpw *, généralement dans pwd.h . Il s’agit essentiellement d’une interface de niveau C avec les informations contenues dans / 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;
}

Regardez getpwnam et struct passwd.

Vous pouvez utiliser les extraits de code suivants:

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

Réf.: getpwnam () getgrnam ()

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top