2012-02-17 10 views
11

getpwname è possibile ottenere solo lo gid di un username.Python: come ottenere gli ID di gruppo di un nome utente (come id -Gn)

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

getgroups può ottenere solo groups dell'utente script.

import os 
myGroupIds = os.getgroups() 

Come posso ottenere tutte groups di una arbitraria username, come il comando id -Gn?

id -Gn `whoami` 
+0

Almeno posso usare dal sottoprocesso importazione check_output mygroups = check_output ([ 'id', '-Gn', utente]). Split() –

risposta

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

Grazie mille. @ Gareth-a-Lloyd. Funziona. Ma non capisco perché 'gid' non sia elencato in' groups' nell'istruzione precedente o perché 'utente non in grp.getgrgid (pwd.getpwnam (utente) .pw_gid) .gr_name'. E mi dispiace, non ho abbastanza reputazione per farti votare per ora. –

+0

'grp' e' pwd' sono moduli di libreria per aiutare a analizzare '/ etc/group' e'/etc/passwd'. Quindi la linea che dà 'groups' viene generata attraversando l'elenco'/etc/group'. Il 'gid' è l'ID di gruppo primario per l'utente dato da'/etc/passwd' questo 'gid' viene quindi utilizzato per cercare il nome del gruppo e aggiungerlo alla lista. –

+0

@ gareth-a-lloyd È interessante notare che l'utente 'non è elencato nel gruppo principale gr_mem'. –

3

Il risultato della id -Gn quando l'utente appartiene a uno o più gruppi in cui diversi nomi di gruppi mappano lo stesso gid potrebbe non essere lo stesso come la risposta pubblicato. Per esempio, se /etc/groups è simile a questo:

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

E se l'utente non è elencato in mygroup ma in mygroup<n>, id -Gn ritorna mygroup ma la risposta postato ritorna mygroup<n>.

Sembra che nel mio ambiente, perché i gruppi UNIX possono avere centinaia o migliaia di utenti, questa è una politica di gestione del gruppo comune, anche se non so esattamente quale sia il limite di utenti per gruppo e perché id -Gn restituisce sempre mygroup .

Tuttavia, con il codice qui sotto ho ottenuto una partita 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

Se si desidera che i gruppi attuali degli utenti.

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

os.getgroups() restituisce l'elenco di gid dell'utente corrente.

grp.getgrgid (g) restituisce informazioni su un gruppo

+1

Questa è la risposta migliore e più concisa – cdjc