我正在尝试编写一个脚本,在每行上输出每个用户及其组,如下所示:
user1 group1
user2 group1
user3 group2
...
user10 group6
等。
我正在python中编写一个脚本,但是想知道SO可能会如何做到这一点。
P.S。用任何语言打击它,但我更喜欢python。
编辑:我在Linux上工作。 Ubuntu 8.10或CentOS =)答案 0 :(得分:23)
对于* nix,您拥有pwd和grp模块。您遍历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数据库已更改)。
...