2009-07-21 36 views
8

Tôi muốn sử dụng Python để lấy id nhóm cho tên nhóm tương ứng. Các thói quen phải làm việc cho hệ điều hành giống Unix (Linux và Mac OS X).lấy id nhóm theo tên nhóm (Python, Unix)

Đây là những gì tôi tìm thấy cho đến nay

>>> import grp 
>>> for g in grp.getgrall(): 
...  if g[0] == 'wurzel': 
...   print g[2] 

Trả lời

15

Nếu bạn đọc grp module documentation bạn sẽ thấy rằng grp.getgrnam (groupname) sẽ trả về một mục nhập từ cơ sở dữ liệu nhóm, mà là một đối tượng tuple-như thế nào. Bạn có thể truy cập thông tin theo chỉ số hoặc bằng thuộc tính:

>>> import grp 
>>> groupinfo = grp.getgrnam('root') 
>>> print groupinfo[2] 
0 
>>> print groupinfo.gr_gid 
0 

mục khác là tên, mật khẩu được mã hóa (thường là trống rỗng, nếu sử dụng một tập tin shadow, nó sẽ là một giá trị dummy) và tất cả các thành viên trong nhóm tên. Này hoạt động tốt trên bất kỳ hệ thống Unix, bao gồm máy tính xách tay Mac OS X của tôi:

>>> import grp 
>>> admin = grp.getgrnam('admin') 
>>> admin 
('admin', '*', 80, ['root', 'admin', 'mj']) 
>>> admin.gr_name 
'admin' 
>>> admin.gr_gid 
80 
>>> admin.gr_mem 
['root', 'admin', 'mj'] 

Các module cũng cung cấp một phương pháp để có được mục bởi gid, và khi bạn phát hiện ra, một phương pháp để lặp qua tất cả các mục trong cơ sở dữ liệu:

>>> grp.getgrgid(80) 
('admin', '*', 80, ['root', 'admin', 'mj']) 
>>> len(grp.getgrall()) 
73 

cuối cùng nhưng không kém, python cung cấp chức năng tương tự để có được thông tin về các tập tin mật khẩu và bóng tối, trong pwdspwd mô-đun, trong đó có một API tương tự.

+0

Lưu ý rằng vì có giới hạn số lượng thành viên nhóm Unix có thể có, một số hệ thống (lớn) có nhiều nhóm Unix với cùng GID nhưng tên khác, ví dụ: 'admin',' admin2', 'admin3', Ví dụ: Bạn có thể không nhận thức được điều này vì tệp được lưu trữ bằng UID/GID dạng số của họ và các công cụ như 'ls' tra cứu GID và hiển thị tên đầu tiên gặp phải, trong ví dụ của tôi là 'quản trị'. Vì vậy, bạn có thể ngạc nhiên khi tìm một tài khoản người dùng cụ thể không nằm trong nhóm 'admin', nhưng thực sự là 'admin2' hoặc bí danh khác. Bạn phải lọc tất cả các nhóm theo GID để tìm bí danh AFAICT. – RobM

5

Xem grp.getgrnam(name):

grp.getgrnam(name)

Return mục cơ sở dữ liệu nhóm cho tên nhóm nhất định. KeyError được nâng lên nếu không thể tìm thấy mục nhập.

mục cơ sở dữ liệu Nhóm được báo cáo như một đối tượng tuple giống như, có các thuộc tính tương ứng với các thành viên của cấu trúc nhóm:

Index Attribute Meaning 

0 gr_name  the name of the group 
1 gr_passwd the (encrypted) group password; often empty 
2 gr_gid the numerical group ID 
3 gr_mem all the group member’s user names 

ID nhóm số là chỉ số 2, hoặc thứ 2 từ cuối cùng, hoặc thuộc tính gr_gid.

GID của root là 0:

>>> grp.getgrnam('root') 
('root', 'x', 0, ['root']) 
>>> grp.getgrnam('root')[-2] 
0 
>>> grp.getgrnam('root').gr_gid 
0 
>>> 
+0

Bạn cũng nên liên kết đến http://docs.python.org/library/grp.html – Stobor

+0

Đúng. Có thể bạn có thể cuộn lên đầu tài liệu trong trình duyệt của mình. – gimel