2012-02-17 27 views
11

getpwname chỉ có thể nhận được gid của số username.Python: Cách nhận id nhóm của một tên người dùng (như id -Gn)

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

getgroups chỉ có thể nhận groups người dùng tập lệnh.

import os 
myGroupIds = os.getgroups() 

Làm thế nào tôi có thể nhận được tất cả groups một tùy username, giống như lệnh id -Gn?

id -Gn `whoami` 
+0

Ít nhất tôi có thể sử dụng từ subprocess nhập khẩu check_output mygroups = check_output ([ 'id', '-Gn', thành viên này]). Split() –

Trả lời

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

Cảm ơn bạn rất nhiều. @ gareth-a-lloyd. Nó hoạt động. Nhưng tôi không hiểu tại sao 'gid' không được liệt kê trong' nhóm' ở câu lệnh trước hoặc tại sao 'người dùng không có trong grp.getgrgid (pwd.getpwnam (user) .pw_gid) .gr_name'. Và xin lỗi, tôi không có đủ danh tiếng để bỏ phiếu cho bạn ngay bây giờ. –

+0

'grp' và' pwd' là các mô-đun thư viện để giúp phân tích cú pháp '/ etc/group' và'/etc/passwd'. Do đó, dòng cung cấp 'nhóm' được tạo ra bằng cách duyệt qua danh sách'/etc/group'. 'Gid' là ID nhóm chính cho người dùng như được đưa ra bởi'/etc/passwd', 'gid' này sau đó được sử dụng để tra cứu tên nhóm và thêm nó vào danh sách. –

+0

@ gareth-a-lloyd Thật thú vị khi 'người dùng' không được liệt kê trong nhóm' gr_mem' của nhóm chính. –

3

Kết quả của id -Gn khi người dùng thuộc về một hoặc nhiều nhóm trong đó bản đồ nhiều tên nhóm với cùng gid có thể không giống như các câu trả lời được đăng. Ví dụ nếu /etc/groups là tương tự như sau:

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

Và nếu người dùng không được liệt kê trong mygroup nhưng trong mygroup<n>, id -Gn lợi nhuận mygroup nhưng câu trả lời gửi trả mygroup<n>. Có vẻ như trong môi trường của tôi, vì nhóm UNIX có thể có hàng trăm hoặc hàng ngàn người dùng, đây là chính sách quản lý nhóm chung, mặc dù tôi không biết chính xác giới hạn người dùng cho mỗi nhóm là gì và tại sao id -Gn luôn trả về mygroup .

Tuy nhiên, với mã dưới đây tôi có một trận đấu với 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

Nếu bạn muốn nhóm người sử dụng hiện nay.

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

os.getgroups() trả về danh sách các gid của người dùng hiện tại.

grp.getgrgid (g) trả về thông tin chi tiết về một nhóm

+1

Đây là câu trả lời hay nhất và ngắn gọn nhất – cdjc

Các vấn đề liên quan