Pourquoi la sortie de «groupes» est-elle différente de «groupes d'utilisateurs» si je suis actuellement connecté en tant qu'utilisateur?

21

Je ne sais pas pourquoi les éléments suivants ont une sortie différente. Ma compréhension est que les groupes sans spécifier un utilisateur donnent tous les groupes dont l'utilisateur actuellement connecté est membre.

jacob@box:~$ groups
jacob adm lp dialout cdrom plugdev lpadmin sambashare

jacob@box:~$ groups jacob
jacob : jacob

Qu'est-ce que cela signifie également "groupes du processus actuel" (à partir de la page de manuel des groupes)? Où sont-ils installés?

REMARQUE: ma distribution est Ubuntu.

Jake
la source
@Jake Essayez de vous déconnecter puis de vous
1
J'ai ce problème à l'envers. 'groups myname' me donne tous les groupes que j'ai dans le fichier / etc / groups, mais faire juste 'groups' ne me montre que mon groupe principal. Et, en effet, les commandes qui nécessitent que je sois dans un certain groupe supplémentaire échouent en raison du manque d'autorisations. J'aimerais bien savoir ce qui a causé ça.
Todd Walton

Réponses:

11

Il pourrait s'agir de l'un des éléments suivants:

  • Ce pourrait être un bug (bien que j'en doute)
  • Vous devrez peut-être vous déconnecter et vous reconnecter

Les groupes sont définis dans le /etc/group.


la source
8

Tout comme chaque processus a un ID utilisateur réel et efficace actuel, et un ID de groupe réel et efficace, il a également une liste de groupes supplémentaires . Ce sont des nombres (pas des noms) tous maintenus par le noyau. Ils sont définis par le processus de connexion (ou le gestionnaire d'affichage) lorsque vous le connectez, tout comme votre ID utilisateur. Ils sont hérités par des sous-processus, tout comme votre ID utilisateur.

Lorsque vous exécutez groupssans arguments, il appelle finalement getgroups () pour obtenir la liste des groupes supplémentaires à partir du noyau. (Sur mon système Linux, / usr / bin / groups est un script shell qui exécute "id -Gn", qui à son tour appelle getgroups ().)

Lorsque vous exécutez groups username, la commande doit "deviner" quels seront les groupes supplémentaires lorsque cet utilisateur se connectera. Elle le fait généralement en lisant / etc / group ou en parlant à NIS ou en parlant à nscd ou ... Eh bien, il y a un beaucoup de façons dont cela pourrait fonctionner.

Ce que vous observez revient à découvrir que votre véritable identifiant utilisateur actuel et votre entrée dans / etc / passwd sont incohérents. Cela signifie qu'il y a quelque chose d'un peu étrange dans la configuration de votre système, mais il est difficile de dire quoi sans enquête supplémentaire.

Nemo
la source
3

(Remarque: La groupscommande, bien que toujours utile, est principalement remplacée par la commande id .)

Un utilisateur a un groupe principal qui est traditionnellement défini dans le fichier /etc/passwdavec lequel il se connecte, mais qui peut avoir aujourd'hui d'autres sources. Il peut également être membre de groupes supplémentaires, dits groupes secondaires ou supplémentaires, traditionnellement spécifiés dans le fichier /etc/groups, mais qui peuvent aujourd'hui également provenir ou être impliqués par des sources supplémentaires (telles que NIS, LDAP, SAMBA, etc.).

Les groupes primaires et supplémentaires sont définis au moment de la connexion et restent à jour . Cependant, l'utilisateur peut à tout moment modifier son groupe principal actif actuel à l'aide de la newgrpcommande.

Le processus de connexion définit les groupes principal et supplémentaire. Pour les versions ultérieures, il appelle généralement la fonction libgroup initgroups , qui compile la liste des données de groupe supplémentaires et la transmet à la fonction setgroups , qui l'établit dans le contexte du processus.

Les sources d'information pour initgroupssont:

utilisé par la bibliothèque GNU C et certaines autres applications pour déterminer les sources à partir desquelles obtenir des informations sur les services de noms dans une série de catégories et dans quel ordre. Chaque catégorie d'informations est identifiée par un nom de base de données.

La groupscommande affiche les groupes actuellement appliqués à votre utilisateur, et la liste commencera par le groupe principal actuel suivi des groupes supplémentaires à partir de la connexion. Les modifications apportées aux sources des données après la connexion ne sont pas reflétées dans la liste affichée.

La groups usernamecommande demande Linux pour calculer les groupes pour cet utilisateur, ce qu'il fera en utilisant principalement les fichiers /etc/password et /etc/groupspuis les autres sources. Cela reflétera la situation actuelle des fichiers système et peut ne pas correspondre aux groupes actuels qui sont toujours en vigueur au moment de la connexion.

La groups usernamecommande peut donner un résultat différent lorsqu'elle n'utilise pas toutes les sources utilisées par le processus de connexion pour calculer vos groupes supplémentaires, ce qui s'est apparemment produit dans votre cas. Ces sources peuvent ne pas être accessibles depuis votre identifiant ou peuvent tout simplement ne pas être consultées par la commande.

L'utilisation de la id usernamecommande peut donner de meilleurs résultats, mais elle n'est pas non plus garantie d'être aussi complète que celle du processus de connexion. La idcommande est plus récente que l'ancienne groupscommande et devait être plus précise que celle-ci .

Bien que la groupscommande donne un résultat précis et correct, vous avez bien démontré que la groups usernamecommande ne peut pas dépendre de faire de même.

Sans examiner le code source de la groupscommande, je suppose que l'implémentation de la groups usernamecommande dans vos analyses de distribution Linux /etc/groups, qui dans votre cas ne contenait rien, mais n'utilise pas /etc/nsswitch.conf, d'où venaient tous vos groupes supplémentaires. Est donc classé que le nom du groupe primaire, jacob.

Pour plus d'informations, voir:

harrymc
la source