2012-02-17 22 views
11

getpwname solo puede obtener el gid de username.Python: cómo obtener ID de grupo de un nombre de usuario (como id -Gn)

import pwd 
myGroupId = pwd.getpwnam(username).pw_gid 

getgroups sólo se puede conseguir groups del usuario guión.

import os 
myGroupIds = os.getgroups() 

¿Cómo puedo obtener toda groups de arbitraria username, al igual que el comando id -Gn?

id -Gn `whoami` 
+0

Al menos puedo utilizar de subproceso check_output importación mygroups = check_output ([ 'id', '-gn', el usuario]). Split() –

Respuesta

22

#!/usr/bin/env python 

import grp, pwd 

user = "myname" 
groups = [g.gr_name for g in grp.getgrall() if user in g.gr_mem] 
gid = pwd.getpwnam(user).pw_gid 
groups.append(grp.getgrgid(gid).gr_name) 
print groups 
+0

Muchas gracias. @ gareth-a-lloyd. Funciona. Pero no entiendo por qué 'gid' no está listado en' groups' en la declaración anterior o por qué 'user no en grp.getgrgid (pwd.getpwnam (user) .pw_gid) .gr_name'. Y lo siento, no tengo la reputación suficiente para votar por ti por ahora. –

+0

'grp' y' pwd' son módulos de biblioteca para ayudar a analizar '/ etc/group' y'/etc/passwd'. Por lo tanto, la línea que da 'groups' se genera al recorrer la lista'/etc/group'. El 'gid' es la identificación del grupo primario para el usuario dada por'/etc/passwd'. Este 'gid' se usa luego para buscar el nombre del grupo y agregarlo a la lista. –

+0

@ gareth-a-lloyd Es interesante que el 'usuario' no aparezca en su grupo principal' gr_mem'. –

3

El resultado de id -Gn cuando el usuario pertenece a uno o más grupos en los que varios nombres de grupos se asignan a la misma gid podría no ser la misma que la respuesta publicado. Por ejemplo, si /etc/groups es similar a esto:

% ypcat group | grep mygroup 
mygroup:*:66485:user1,user2,user3,... 
mygroup1:*:66485:user101,user102,user103,... 
mygroup2:*:66485:user201,user202,user203,... 
... 

Y si el usuario no aparece en mygroup pero en mygroup<n>, id -Gn vuelve mygroup pero la respuesta vuelve publicado mygroup<n>.

Parece que en mi entorno, como los grupos UNIX pueden tener cientos o miles de usuarios, esta es una política común de administración de grupo, aunque no sé exactamente cuál es el límite de usuario por grupo y por qué id -Gn siempre devuelve mygroup .

Sin embargo, con el código de abajo Tengo un partido con id -Gn:

import pwd, grp  

def getgroups(user): 
    gids = [g.gr_gid for g in grp.getgrall() if user in g.gr_mem] 
    gid = pwd.getpwnam(user).pw_gid 
    gids.append(grp.getgrgid(gid).gr_gid) 
    return [grp.getgrgid(gid).gr_name for gid in gids] 
3

Si quieres grupos de los usuarios actuales.

import os, grp 
[grp.getgrgid(g).gr_name for g in os.getgroups()] 

os.getgroups() devuelve la lista de gids del usuario actual.

grp.getgrgid (g) devuelve detalles sobre un grupo

+1

Esta es la mejor y más concisa respuesta – cdjc

Cuestiones relacionadas