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

时间:2009-01-07 19:05:11

标签: python linux sysadmin

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

user1 group1  
user2 group1  
user3 group2  
...  
user10 group6

等。

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

P.S。用任何语言打击它,但我更喜欢python。

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

6 个答案:

答案 0 :(得分:23)

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

import pwd, grp
for p in pwd.getpwall():
    print p[0], grp.getgrgid(p[3])[0]

答案 1 :(得分:14)

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

编辑示例:

import grp
groups = grp.getgrall()
for group in groups:
    for user in group[3]:
        print user, group[0]

答案 2 :(得分:5)

SH / bash中:

getent passwd | cut -f1 -d: | while read name; do echo -n "$name " ; groups $name ; done

答案 3 :(得分:2)

'material.theme.brown' --> brown 'material.theme.yellow' --> purple 'material.theme.lime' --> orange 'material.theme.lightgreen' --> lime 'material.theme.green' --> lightblue 'material.theme.teal' --> teal 'material.theme.blue' --> orange 'material.theme.indigo' --> green .... 的python调用仅显示本地组,而不是调用getgrouplist c函数,该函数重新编译所有用户,例如: sssd中的用户也是由ldap支持但枚举已关闭的用户。 (就像在FreeIPA中一样)。 在搜索了最简单的方法来获取用户所属的所有组后,我发现最好的方法是实际调用getgrouplist c函数:

grp.getgrall()

获取运行此函数的所有用户的列表同样需要确定#!/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 进行的c调用并在python中调用它。

答案 4 :(得分:0)

我相信这段代码只需要使用Python解释器的核心功能就可以满足您的需求,而无需使用其他模块:

  

一个简单的函数,它能够处理这些文件中的任何一个的结构(/ etc / passwd和/ etc / group)。

以下是代码:

#!/usr/bin/python

data = []

def iterator(f):
    for line in f.readlines():
        data.append(line.split(":")[0])
    data.sort()
    for item in data:
        print("- " + item)


with open("/etc/group","r") as f:
    print("\n* GROUPS *")
    iterator(f)
    print()

with open("/etc/passwd","r") as f:
    print("\n* USERS *")
    iterator(f)    

答案 5 :(得分:-2)

加入os.popen或其他......

&#34; man groups&#34;

组(1)用户命令组(1)

NAME        groups - 打印用户所在的组

概要        组[选项] ... [用户名] ...

说明        打印每个USERNAME的组成员资格,如果没有指定USERNAME,则为当前进程打印(如果是,则可能会有所不同)        groups数据库已更改)。

...