2012-02-17 14 views
11

getpwname केवल के gid प्राप्त कर सकते हैं।पायथन: एक उपयोगकर्ता नाम (जैसे आईडी-जीएन) की समूह आईडी कैसे प्राप्त करें

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

getgroups केवल स्क्रिप्ट उपयोगकर्ता के groups मिल सकती है।

import os 
myGroupIds = os.getgroups() 

मैं कैसे के सभी groups एक मनमाना username प्राप्त कर सकते हैं, id -Gn आदेश की तरह?

id -Gn `whoami` 
+0

कम से कम मैं उपप्रक्रिया आयात check_output से उपयोग कर सकते हैं mygroups = check_output ([ 'आईडी', '-Gn', उपयोगकर्ता])। विभाजन() –

उत्तर

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

बहुत बहुत धन्यवाद। @ गैरेथ-ए-लॉयड। यह काम करता हैं। लेकिन मुझे समझ नहीं आता क्यों 'gid' पिछले बयान या क्यों' उपयोगकर्ता नहीं grp.getgrgid में (pwd.getpwnam (उपयोगकर्ता) .pw_gid) .gr_name' पर 'groups' में सूचीबद्ध नहीं है। और क्षमा करें, मेरे पास अभी आपको वोट देने के लिए पर्याप्त प्रतिष्ठा नहीं है। –

+0

'grp' और' pwd' पार्स '/ etc/group' और'/etc/passwd' मदद करने के लिए पुस्तकालय मॉड्यूल हैं। इसलिए 'समूह' प्रदान करने वाली रेखा '/ etc/group' लिस्टिंग को ट्रैवर्स करके उत्पन्न होती है। 'Gid' उपयोगकर्ता के लिए प्राथमिक समूह आईडी है जिसे'/etc/passwd' द्वारा दिया गया है, यह 'gid' तब समूह के नाम को देखने और सूची में जोड़ने के लिए उपयोग किया जाता है। –

+0

@ gareth-a-lloyd यह दिलचस्प है कि 'उपयोगकर्ता' को इसके प्राथमिक समूह के 'gr_mem' में सूचीबद्ध नहीं किया गया है। –

3

id -Gn का परिणाम उपयोगकर्ता एक या अधिक समूहों, जिसमें कई समूहों के नाम एक ही gid करने के लिए नक्शे पोस्ट जवाब के रूप में एक ही नहीं हो सकता है के अंतर्गत आता है जब। उदाहरण के लिए अगर /etc/groups इस के समान है:

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

और उपयोगकर्ता mygroup में सूचीबद्ध नहीं है, तो लेकिन mygroup<n> में, id -Gn रिटर्न mygroup लेकिन पोस्ट जवाब देता है mygroup<n>

ऐसा लगता है कि मेरे पर्यावरण में, क्योंकि यूनिक्स समूहों में सैकड़ों या हजारों उपयोगकर्ता हो सकते हैं, यह एक आम समूह प्रबंधन नीति है, हालांकि मुझे नहीं पता कि प्रति समूह उपयोगकर्ता सीमा क्या है और क्यों id -Gn हमेशा mygroup लौटाता है ।

फिर भी, नीचे दिए गए कोड मैं 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

आप वर्तमान उपयोगकर्ताओं के समूहों चाहते हैं।

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

os.getgroups() वर्तमान उपयोगकर्ता के ग्रिड की सूची देता है।

grp.getgrgid (छ) एक समूह के बारे में जानकारी देता है

+1

यह सबसे अच्छा और सबसे संक्षिप्त उत्तर है – cdjc

संबंधित मुद्दे