web-dev-qa-db-ja.com

Pythonユーザーとグループを一覧表示するスクリプト

次のように、各ユーザーとそのグループを独自の行に出力するスクリプトをコーディングしようとしています。

user1 group1  
user2 group1  
user3 group2  
...  
user10 group6

等.

私はこれのためにpythonでスクリプトを書いていますが、SOがこれをどのように行うのか疑問に思っていました。

p.s.どんな言語でもそれを叩いてみてください、しかし私はpythonが好きです。

編集:私はLinuxに取り組んでいます。 Ubuntu8.10またはCentOS =)

23
Derek

* nixの場合、 pwd および grp モジュールがあります。 pwd.getpwall()を繰り返し処理して、すべてのユーザーを取得します。 grp.getgrgid(gid)でグループ名を検索します。

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

grpモジュールはあなたの友達です。 grp.getgrall()を見て、すべてのグループとそのメンバーのリストを取得します。

[〜#〜] edit [〜#〜]例:

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

sh/bash:

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

python grp.getgrall()の呼び出しは、すべてのユーザーを再実行するgetgrouplist c関数の呼び出しとは異なり、ローカルグループのみを表示します。たとえば、LDAPによってサポートされているsssdのユーザーも表示されますが(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

同様にこの関数を実行するすべてのユーザーのリストを取得するには、getent passwdによって行われるc呼び出しを把握し、それをpythonで呼び出す必要があります。

4
Jens Timmerman

これらのファイル(/ 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")
1
ivanleoncz