列出用户和组的 Python 脚本
- 2024-11-08 08:44:00
- admin 原创
- 37
问题描述:
我正在尝试编写一个脚本,将每个用户及其组输出在他们自己的行上,如下所示:
user1 group1
user2 group1
user3 group2
...
user10 group6
ETC。
我正在用 Python 编写一个脚本来实现这一点,但想知道 SO 如何做到这一点。
ps 用任何语言都可以尝试一下,但我更喜欢python。
编辑:我在 Linux 上工作。Ubuntu 8.10 或 CentOS =)
解决方案 1:
对于 *nix,您有pwd和grp模块。您迭代pwd.getpwall()
以获取所有用户。您使用 查找他们的组名grp.getgrgid(gid)
。
import pwd, grp
for p in pwd.getpwall():
print p[0], grp.getgrgid(p[3])[0]
解决方案 2:
该grp
模块是您的好朋友。查看grp.getgrall()
以获取所有群组及其成员的列表。
编辑示例:
import grp
groups = grp.getgrall()
for group in groups:
for user in group[3]:
print user, group[0]
解决方案 3:
sh/bash:
getent passwd | cut -f1 -d: | while read name; do echo -n "$name " ; groups $name ; done
解决方案 4:
python 调用grp.getgrall()
仅显示本地组,不同于调用 getgrouplist c 函数,后者会返回所有用户,例如由 ldap 支持但已关闭枚举的 sssd 中的用户。(就像在 FreeIPA 中一样)。在搜索获取用户所属的所有组的最简单方法后,我发现最好的方法是实际调用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
类似地,获取要运行该函数的所有用户的列表需要弄清楚由什么 c 调用getent passwd
,然后在 python 中调用它。
解决方案 5:
一个简单的函数,能够处理任何一个文件(/etc/passwd 和 /etc/group)的结构。
我相信此代码可以满足您的需求,具有 Python 内置函数且无需附加模块:
#!/usr/bin/python
def read_and_parse(filename):
"""
Reads and parses lines from /etc/passwd and /etc/group.
Parameters
filename : str
Full path for filename.
"""
data = []
with open(filename, "r") as f:
for line in f.readlines():
data.append(line.split(":")[0])
data.sort()
for item in data:
print("- " + item)
read_and_parse("/etc/group")
read_and_parse("/etc/passwd")
相关推荐
热门文章
项目管理软件有哪些?
- 2024年20款好用的项目管理软件推荐,项目管理提效的20个工具和技巧
- 2024年开源项目管理软件有哪些?推荐5款好用的项目管理工具
- 项目管理软件有哪些?推荐7款超好用的项目管理工具
- 项目管理软件哪个最好用?盘点推荐5款好用的项目管理工具
- 项目管理软件有哪些最好用?推荐6款好用的项目管理工具
- 项目管理软件有哪些,盘点推荐国内外超好用的7款项目管理工具
- 2024项目管理软件排行榜(10类常用的项目管理工具全推荐)
- 项目管理软件排行榜:2024年项目经理必备5款开源项目管理软件汇总
- 2024年常用的项目管理软件有哪些?推荐这10款国内外好用的项目管理工具
- 项目管理必备:盘点2024年13款好用的项目管理软件
热门标签
云禅道AD