Python3通过chmod修改目录或文件权限的方法示例


Posted in Python onJune 08, 2020

简单的介绍下linux文件权限

linux中,文件的权限分为"所有者、组、其他用户"三个角色,每个角色由3个bit位表示它的权限,3bit从左到右分别为读写执行三个权限,3bit的值范围为0~7。所以如果直接在linux执行chmod 777 xxx.sh代表,将xxx.sh文件赋予所有者、组、其他用户这三个角色对xxx.sh文件的读写执行权限。

os的chmod

python的os模块负责操作系统层面的操作。修改文件权限可以通过os的chmod方法来操作。
os.chmod(path, mode)
方法的path指向要赋权限的文件或目录;
mode为权限值,也就是文件权限的9位bit的10进制数,取值范围0~511;

比如我们要将xxx.sh文件赋予所有者读权限,其他角色没有任何的权限,则linux中对应的文件权限用ls -l查看为:-r---------;第一个-是文件类型,后面的9个位就代表了整个文件的权限,对应二进制为100000000,那么我们的mode应该取值为256;
所以上面的权限修改代码为os.chmod("xxx.sh",256)。

这么麻烦?

还好stat模块提供了常量值可以直接对应使用。

常量 描述
S_IRWXU 所有者读写执行权限,代表值:448
S_IRUSR 所有者读,代表值:256
S_IWUSR 所有者写,代表值:128
S_IXUSR 所有者执行,代表值:64
S_IRWXG 用户组读写执行权限,代表值:56
S_IRGRP 用户组读,代表值:32
S_IWGRP 用户组写,代表值:16
S_IXGRP 用户组执行,代表值:8
S_IRWXO 其他用户读写执行,代表值:7
S_IROTH 其他用户读,代表值:4
S_IWOTH 其他用户写,代表值:2
S_IXOTH 其他用户执行,代表值:1

如下的代码是将xxx.sh文件赋予所有者读写执行、用户组读执行、其他用户读的操作,即-rwxr-xr--:

import os
import stat

os.chmod("xxx.sh", stat.S_IRWXU+stat.S_IRGRP+stat.S_IXGRP+stat.S_IROTH)

什么?感觉常量记不住?还是不方便?

写个类似chmod 777的使用方式的util吧…

import re
import os
import stat

RD, WD, XD = 4, 2, 1
BNS = [RD, WD, XD]
MDS = [
  [stat.S_IRUSR, stat.S_IRGRP, stat.S_IROTH],
  [stat.S_IWUSR, stat.S_IWGRP, stat.S_IWOTH],
  [stat.S_IXUSR, stat.S_IXGRP, stat.S_IXOTH]
]

def chmod(path, mode):
  if isinstance(mode, int):
    mode = str(mode)
  if not re.match("^[0-7]{1,3}$", mode):
    raise Exception("mode does not conform to ^[0-7]{1,3}$ pattern")
  mode = "{0:0>3}".format(mode)
  mode_num = 0
  for midx, m in enumerate(mode):
    for bnidx, bn in enumerate(BNS):
      if (int(m) & bn) > 0:
        mode_num += MDS[bnidx][midx]
  os.chmod(path, mode_num)

if __name__ == '__main__':
  chmod("xxx.sh", "744") #744代表所有者读写执行,组和其他的权限只有读

类似的你也可以让它支持类似chmod u+rwx,g+rw,o+rw xxx.sh的使用方式。

注意:os.chmod貌似没有办法递归修改目录下所有文件的权限?那使用下面的subprocess直接调用命令吧…

subprocess直接调用chmod命令

subprocess模块实现了子进程运行。可以在子进程中调用操作系统命令或者执行shell,并获取stdout、stderr。

import subprocess

if __name__ == '__main__':
  cmd = ['chmod', "-R", "777", "xxx.sh"]
  res = subprocess.run(cmd, universal_newlines=True, stdout=subprocess.PIPE,
             stderr=subprocess.PIPE, shell=False)

  print(res.returncode, res.stdout, res.stderr)

 到此这篇关于Python3通过chmod修改目录或文件权限的方法示例的文章就介绍到这了,更多相关Python3 chmod修改目录或文件权限内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python使用PIL模块实现给图片打水印的方法
May 22 Python
Python中map和列表推导效率比较实例分析
Jun 17 Python
Django框架中render_to_response()函数的使用方法
Jul 16 Python
python抓取网页中链接的静态图片
Jan 29 Python
python在每个字符后添加空格的实例
May 07 Python
解决使用pycharm提交代码时冲突之后文件丢失找回的方法
Aug 05 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
Python为何不能用可变对象作为默认参数的值
Jul 01 Python
python使用paramiko模块通过ssh2协议对交换机进行配置的方法
Jul 25 Python
详解从Django Allauth中进行登录改造小结
Dec 18 Python
Django日志及中间件模块应用案例
Sep 10 Python
python使用dlib进行人脸检测和关键点的示例
Dec 05 Python
win10下python3.8的PIL库安装过程
Jun 08 #Python
python rolling regression. 使用 Python 实现滚动回归操作
Jun 08 #Python
Python selenium爬虫实现定时任务过程解析
Jun 08 #Python
python:HDF和CSV存储优劣对比分析
Jun 08 #Python
Python实现一个简单的毕业生信息管理系统的示例代码
Jun 08 #Python
Python while true实现爬虫定时任务
Jun 08 #Python
python 实现rolling和apply函数的向下取值操作
Jun 08 #Python
You might like
php设计模式 Composite (组合模式)
2011/06/26 PHP
PHP 配置后台登录以及模板引入
2017/01/24 PHP
php实现微信模拟登陆、获取用户列表及群发消息功能示例
2017/06/28 PHP
Yii2语言国际化的配置教程
2018/08/19 PHP
Angularjs 基础入门
2014/12/26 Javascript
Nodejs学习笔记之入门篇
2015/04/16 NodeJs
jQuery实现仿腾讯微博滑出效果报告每日天气的方法
2015/05/11 Javascript
BootstrapValidator实现注册校验和登录错误提示效果
2017/03/10 Javascript
Vue动态实现评分效果
2017/05/24 Javascript
jQuery事件_动力节点Java学院整理
2017/07/05 jQuery
Vue2.0 slot分发内容与props验证的方法
2017/12/12 Javascript
vue响应式更新机制及不使用框架实现简单的数据双向绑定问题
2019/06/27 Javascript
Vue Extends 扩展选项用法完整实例
2019/09/17 Javascript
[51:10]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
学习python (1)
2006/10/31 Python
解决Linux系统中python matplotlib画图的中文显示问题
2017/06/15 Python
Python元字符的用法实例解析
2018/01/17 Python
python内置数据类型之列表操作
2018/11/12 Python
python 梯度法求解函数极值的实例
2019/07/10 Python
python networkx 根据图的权重画图实现
2019/07/10 Python
Python使用字典实现的简单记事本功能示例
2019/08/15 Python
使用python实现哈希表、字典、集合操作
2019/12/22 Python
Python如何给函数库增加日志功能
2020/08/04 Python
详解python的super()的作用和原理
2020/10/29 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
生产副总岗位职责
2013/11/28 职场文书
文明风采获奖感言
2014/02/18 职场文书
三年级评语大全
2014/04/23 职场文书
物流管理专业自荐信
2014/06/23 职场文书
经济贸易系求职信
2014/08/04 职场文书
歌颂党的演讲稿
2014/09/10 职场文书
地下停车场租赁协议范本
2014/10/07 职场文书
幼儿园大班教师随笔
2015/08/14 职场文书
redis requires ruby version2.2.2的解决方案
2021/07/15 Redis
html5调用摄像头截图功能
2022/01/18 Javascript
Elasticsearch 数据类型及管理
2022/04/19 Python