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,您有pwd和grp模块.您遍历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)
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)
SH/bash的:
getent passwd | cut -f1 -d: | while read name; do echo -n "$name " ; groups $name ; done
Run Code Online (Sandbox Code Playgroud)
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 中调用它。
归档时间: |
|
查看次数: |
24536 次 |
最近记录: |