2009-09-28 4 views
0

La commande linux 'id' rapporte les groupes = auxquels ce processus appartient. Quand et comment cela est-il rempli? J'écris un programme suid/sgid et il semble que les groupes ne sont jamais remplis pour mon processus et peut-être juste de manière coïncidente, mais les permissions en ce qui concerne un système de fichiers monté nfs ne fonctionnent pas correctement pour cela (d'ailleurs, j'ai joué avec no_root_squash et cela n'a pas aidé)id linux no_squash_root

+0

Peut-être pourriez-vous poster du code et/ou une transcription de shell montrant exactement ce que vous voyez qui est différent de ce à quoi vous vous attendez? Votre programme fonctionne-t-il correctement s'il n'est pas sur un système de fichiers NFS? –

Répondre

2

Dans la plupart des cas, les groupes supplémentaires sont définis par login.

Si vous voulez les mettre vous-même, vous aurez besoin des fonctions getgrouplist() et setgroups() de <grp.h> - notez que vous devrez être root pour appeler setgroups() avec succès.

+0

Notez que ces fonctions - et initgroups() - sont toutes en dehors de la portée de la norme POSIX. Ils ne sont pas tous universellement disponibles sur toutes les plates-formes Unix-like; en particulier, la fonction 'getgrouplist()' n'est pas disponible sur Solaris, par exemple. Aussi, pirater votre propre 'getgrouplist()' est cher; vous devez lire le fichier 'groupe' entier (base de données) parce que le fichier brut/etc/group ne fournit pas la structure 'index inversé' nécessaire pour répondre à la question 'quels groupes l'utilisateur X appartient' plus efficacement. –

0
  • L'appartenance à plusieurs groupes est normalement définie lors de la connexion mais n'est pas beaucoup utilisée. SOP est souvent de donner à chaque utilisateur son propre groupe.

  • Les systèmes de fichiers réseau ne respectent généralement pas les privilèges de racine client locaux.

1

Merci, le setgroups() était à peu près la réponse. Cependant, j'ai fini par utiliser initgroups() qui fonctionnait très bien. L'appel a été fait avant que je fasse le setuid loin de la racine.

trouvé cela dans les pages de manuel NOM initgroups - initialiser la liste d'accès de groupe supplémentaire

SYNOPSIS #include #include

int initgroups(const char *user, gid_t group); 

Apparemment, si les groupes viennent de LDAP, vous devez faites ceci afin de les remplir correctement.