web-dev-qa-db-fra.com

Comment changer les autorisations d'utilisateurs et de groupes pour un répertoire, par nom?

os.chown est exactement ce que je veux, mais je veux spécifier l'utilisateur et le groupe par nom, pas par ID (je ne sais pas ce qu'ils sont). Comment puis je faire ça?

52
mpen
import pwd
import grp
import os

uid = pwd.getpwnam("nobody").pw_uid
gid = grp.getgrnam("nogroup").gr_gid
path = '/tmp/f.txt'
os.chown(path, uid, gid)
102

Depuis Python 3.3 https://docs.python.org/3.3/library/shutil.html#shutil.chown

import shutil
shutil.chown(path, user=None, group=None)

Changer l'utilisateur propriétaire et/ou le groupe du chemin donné.

utilisateur peut être un nom d'utilisateur système ou un uid; il en va de même pour le groupe.

Au moins un argument est requis.

Disponibilité: Unix.

29
Oleg Neumyvakin

Étant donné que la version shutil prend en charge le groupe étant facultatif, je copie et colle le code dans mon projet Python2.

https://hg.python.org/cpython/file/tip/Lib/shutil.py#l101

def chown(path, user=None, group=None):
    """Change owner user and group of the given path.

    user and group can be the uid/gid or the user/group names, and in that case,
    they are converted to their respective uid/gid.
    """

    if user is None and group is None:
        raise ValueError("user and/or group must be set")

    _user = user
    _group = group

    # -1 means don't change it
    if user is None:
        _user = -1
    # user can either be an int (the uid) or a string (the system username)
    Elif isinstance(user, basestring):
        _user = _get_uid(user)
        if _user is None:
            raise LookupError("no such user: {!r}".format(user))

    if group is None:
        _group = -1
    Elif not isinstance(group, int):
        _group = _get_gid(group)
        if _group is None:
            raise LookupError("no such group: {!r}".format(group))

    os.chown(path, _user, _group)
3
guettli