Как изменить права пользователя и группы для каталога по имени? - PullRequest
52 голосов
/ 13 мая 2011

os.chown - это именно то, что я хочу, но я хочу указать пользователя и группу по имени, а не по идентификатору (я не знаю, кто они). Как я могу это сделать?

Ответы [ 4 ]

101 голосов
/ 13 мая 2011
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)
29 голосов
/ 26 января 2015

Начиная с Python 3.3 https://docs.python.org/3.3/library/shutil.html#shutil.chown

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

Смена владельца пользователя и / или группы по указанному пути.

user может быть именем пользователя системы или uid;То же самое относится и к группе.

Требуется хотя бы один аргумент.

Доступность: Unix.

3 голосов
/ 22 октября 2015

Поскольку версия shutil поддерживает необязательную группу, я копирую и вставляю код в мой проект Python2.

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

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)
0 голосов
/ 13 мая 2011

Вы можете использовать id -u wong2 для получения идентификатора пользователя
Вы можете сделать это с помощью python:

import os 
def getUidByUname(uname):
    return os.popen("id -u %s" % uname).read().strip()

Затем используйте идентификатор для os.chown

...