列出用户和组的 Python 脚本

2024-11-08 08:44:00
admin
原创
214
摘要:问题描述:我正在尝试编写一个脚本,将每个用户及其组输出在他们自己的行上,如下所示:user1 group1 user2 group1 user3 group2 ... user10 group6 ETC。 我正在用 Python 编写一个脚本来实现这一点,但想知道 SO 如何做到这一点。ps ...

问题描述:

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

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")
相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用