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写asp详细讲解
Dec 16 Python
Python打包文件夹的方法小结(zip,tar,tar.gz等)
Sep 18 Python
Python实现常见的回文字符串算法
Nov 14 Python
mac系统下Redis安装和使用步骤详解
Jul 09 Python
python使用requests.session模拟登录
Aug 09 Python
Python网络编程之使用TCP方式传输文件操作示例
Nov 01 Python
Python使用matplotlib绘制Logistic曲线操作示例
Nov 28 Python
使用 Python 处理3万多条数据只要几秒钟
Jan 19 Python
Python BeautifulReport可视化报告代码实例
Apr 13 Python
python不同系统中打开方法
Jun 23 Python
python用字节处理文件实例讲解
Apr 13 Python
Appium中scroll和drag_and_drop根据元素位置滑动
Feb 15 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 文件上传模型,支持多文件上传
2009/08/13 PHP
PHP中的strtr函数使用介绍(str_replace)
2011/10/20 PHP
PHP新手用的Insert和Update语句构造类
2012/03/31 PHP
php多层数组与对象的转换实例代码
2013/08/05 PHP
php生成静态页面的简单示例
2014/04/17 PHP
PHP多线程之内部多线程实例分析
2015/03/09 PHP
laravel Validator ajax返回错误信息的方法
2019/09/29 PHP
ExtJS Ext.MessageBox.alert()弹出对话框详解
2010/04/02 Javascript
JavaScript之编码规范 推荐
2012/05/23 Javascript
使用非html5实现js板连连看游戏示例代码
2013/09/22 Javascript
jqgrid 编辑添加功能详细解析
2013/11/08 Javascript
JavaScript异步回调的Promise模式封装实例
2014/06/07 Javascript
vue数据双向绑定原理解析(get & set)
2017/03/08 Javascript
基于rem的移动端响应式适配方案(详解)
2017/07/07 Javascript
Vue+SpringBoot开发V部落博客管理平台
2017/12/27 Javascript
vue 中swiper的使用教程
2018/05/22 Javascript
vue数组对象排序的实现代码
2018/06/20 Javascript
vue通过style或者class改变样式的实例代码
2018/10/30 Javascript
vue在线动态切换主题色方案
2020/03/26 Javascript
Openlayers学习之加载鹰眼控件
2020/09/28 Javascript
python中的代码编码格式转换问题
2015/06/10 Python
python代码 if not x: 和 if x is not None: 和 if not x is None:使用介绍
2016/09/21 Python
Python实现将一个大文件按段落分隔为多个小文件的简单操作方法
2017/04/17 Python
Python中的pathlib.Path为什么不继承str详解
2019/06/23 Python
详解css3 mask遮罩实现一些特效
2018/10/24 HTML / CSS
html5 viewport使用方法示例详解
2013/12/02 HTML / CSS
使用phonegap播放音频的实现方法
2017/03/31 HTML / CSS
html5 canvas的绘制文本自动换行的示例代码
2018/09/17 HTML / CSS
中国跨境电商:Tomtop
2017/03/16 全球购物
大学生学习2014全国两会心得体会
2014/03/13 职场文书
六个一活动实施方案
2014/03/21 职场文书
财务人员担保书
2014/05/13 职场文书
教代会闭幕词
2015/01/28 职场文书
2015年生活老师工作总结
2015/05/27 职场文书
婚礼上证婚人致辞
2015/07/28 职场文书
vue中利用mqtt服务端实现即时通讯的步骤记录
2021/07/01 Vue.js