Obtenir par programme l'UID et le GID d'un nom d'utilisateur sous Unix?
-
06-07-2019 - |
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
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 ()