用于列出用户和组的Python脚本

Der*_*rek 23 python linux sysadmin

我正在尝试编写一个脚本,在自己的行上输出每个用户及其组,如下所示:

user1 group1  
user2 group1  
user3 group2  
...  
user10 group6
Run Code Online (Sandbox Code Playgroud)

等等

我正在python中编写一个脚本,但是想知道SO是如何做到这一点的.

ps用任何语言对它进行打击,但我更喜欢python.

编辑:我在Linux上工作.Ubuntu 8.10或CentOS =)

S.L*_*ott 23

对于*nix,您有pwdgrp模块.您遍历pwd.getpwall()以获取所有用户.你用他们的组名查找grp.getgrgid(gid).

import pwd, grp
for p in pwd.getpwall():
    print p[0], grp.getgrgid(p[3])[0]
Run Code Online (Sandbox Code Playgroud)

  • pwd.getpwall仅显示本地用户,而不显示来自例如ldap的用户(当enumerate = false时) (3认同)

d0k*_*d0k 14

grp模块是你的朋友.查看grp.getgrall()获取所有组及其成员的列表.

编辑示例:

import grp
groups = grp.getgrall()
for group in groups:
    for user in group[3]:
        print user, group[0]
Run Code Online (Sandbox Code Playgroud)

  • 此解决方案仅列出用户的 *次要* 组。我读到的问题是它要求“他们的组”,即 [singular] 用户的 *primary* 组? (2认同)

Joa*_*uer 5

SH/bash的:

getent passwd | cut -f1 -d: | while read name; do echo -n "$name " ; groups $name ; done
Run Code Online (Sandbox Code Playgroud)


Jen*_*man 5

python 调用grp.getgrall()只显示本地组,不像调用 getgrouplist c 函数返回所有用户,例如还有 sssd 中的用户,它由 ldap 支持但已关闭枚举。(就像在 FreeIPA 中一样)。在 python 中寻找获取用户所属所有组的最简单方法后,我发现最好的方法是实际调用getgrouplist c 函数:

#!/usr/bin/python

import grp, pwd, os
from ctypes import *
from ctypes.util import find_library

libc = cdll.LoadLibrary(find_library('libc'))

getgrouplist = libc.getgrouplist
# 50 groups should be enought?
ngroups = 50
getgrouplist.argtypes = [c_char_p, c_uint, POINTER(c_uint * ngroups), POINTER(c_int)]
getgrouplist.restype = c_int32

grouplist = (c_uint * ngroups)()
ngrouplist = c_int(ngroups)

user = pwd.getpwuid(2540485)

ct = getgrouplist(user.pw_name, user.pw_gid, byref(grouplist), byref(ngrouplist))

# if 50 groups was not enough this will be -1, try again
# luckily the last call put the correct number of groups in ngrouplist
if ct < 0:
    getgrouplist.argtypes = [c_char_p, c_uint, POINTER(c_uint *int(ngrouplist.value)), POINTER(c_int)]
    grouplist = (c_uint * int(ngrouplist.value))()
    ct = getgrouplist(user.pw_name, user.pw_gid, byref(grouplist), byref(ngrouplist))

for i in xrange(0, ct):
    gid = grouplist[i]
    print grp.getgrgid(gid).gr_name
Run Code Online (Sandbox Code Playgroud)

获取所有用户的列表以类似的方式运行此函数需要弄清楚 c 调用是由什么进行的,getent passwd并在 python 中调用它。