Frage

Ich versuche setuid () zu verwenden und setgid (), um die jeweiligen IDs eines Programms festlegen Privilegien von der Wurzel fallen nach unten, aber sie benutze ich die uid und gid des Benutzers müssen wissen, ich ändern wollen zu.

Gibt es einen Systemaufruf, dies zu tun? Ich will nicht, es codieren oder von / etc / passwd zu analysieren.

Auch würde Ich mag dies als die Verwendung programmatisch eher tun:

id -u Benutzername

Jede Hilfe wäre sehr dankbar

War es hilfreich?

Lösung

Haben Sie einen Blick auf die getpwnam () und getgrnam () Funktionen.

Andere Tipps

Sie möchten die getpw * Familie von Systemaufrufen verwenden, in der Regel in pwd.h . Es ist im Wesentlichen eine C-Level-Schnittstelle zu den Informationen in / 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;
}

Schauen Sie sich getpwnam und struct passwd.

Sie können den folgenden Code-Schnipsel verwenden:

#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 ()

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top