【问题标题】:How to change the user and group permissions for a directory, by name?如何按名称更改目录的用户和组权限?
【发布时间】:2011-08-25 02:08:12
【问题描述】:

os.chown 正是我想要的,但我想按名称指定用户和组,而不是 ID(我不知道它们是什么)。我该怎么做?

【问题讨论】:

标签: python operating-system chown


【解决方案1】:

您可以使用id -u wong2 获取用户的uid
你可以用 python 做到这一点:

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

然后用id去os.chown

【讨论】:

    【解决方案2】:
    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)
    

    【讨论】:

    【解决方案3】:

    自 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。

    【讨论】:

      【解决方案4】:

      由于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)
      

      【讨论】:

      • 你应该检查 basestr no 吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-11-01
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多