当前位置:首页 > 实用技巧 >

python生成文件时没有权限(python创建文件却提示找不到文件)

来源:原点资讯(www.yd166.com)时间:2024-01-03 08:28:26作者:YD166手机阅读>>

目录

  • 需求背景
  • 常用方法及其缺陷分析
  • 改进后的python文件创建方法
  • 总结概要
  • 参考链接
  • 版权声明
需求背景

用python进行文件的创建和读写操作时,我们很少关注所创建的文件的权限配置。对于一些安全性较高的系统,如果我们创建的文件权限其他用户或者同一用户组里的其他用户有可读权限的话,有可能导致不必要的信息泄漏的风险。因此,除了创建一个更加安全和隐私的个人环境之外(如容器环境等),我们还可以对生成的文件的配置进行权限最小化处理。

常用方法及其缺陷分析

常用的python文件创建和读写方法,是直接通过内置的open函数创建一个文件。这里如果是使用with语法来创建的,结束语句后会自动关闭被打开的对象。而如果是直接使用open函数来定义一个对象,则需要在任务结束时手动的执行close操作。以下演示内置函数open的用法及其文件操作属性,首先创建一个名为file-test.py的文件:

# file-test.py with open('test1.txt', 'w') as file: file.write('hello world!')

该任务的内容为:在当前目录下创建一个名为test1.txt的文件,清空该文件的内容后,在文件中写入hello world!这个字符串。接下来用python3执行该文件:

[dechin@dechin-manjaro os_security]$ python3 file-test.py [dechin@dechin-manjaro os_security]$ ll 总用量 8 -rw-r--r-- 1 dechin dechin 83 1月 25 13:43 file-test.py -rw-r--r-- 1 dechin dechin 12 1月 25 13:43 test1.txt

这里我们发现,在执行之后成功产生了test1.txt这个文件,其权限配置为644,与前面创建的file-test.py保持一致。在不清楚内置函数open的实现原理时,原本以为这个产生的文件权限配置是与当前的py文件保持一致的。然而经过进一步的测试,将py文件的权限配置为440之后再重新执行该文件:

[dechin@dechin-manjaro os_security]$ chmod 440 file-test.py [dechin@dechin-manjaro os_security]$ ll 总用量 8 -r--r----- 1 dechin dechin 83 1月 25 13:43 file-test.py -rw-r--r-- 1 dechin dechin 12 1月 25 13:43 test1.txt [dechin@dechin-manjaro os_security]$ rm test1.txt [dechin@dechin-manjaro os_security]$ python3 file-test.py [dechin@dechin-manjaro os_security]$ ll 总用量 8 -r--r----- 1 dechin dechin 83 1月 25 13:43 file-test.py -rw-r--r-- 1 dechin dechin 12 1月 25 13:44 test1.txt

这里从测试结果我们可以看出,python的内置函数open产生的文件类型是与源py文件无关的。关于这里py文件的执行是否需要可执行权限,可以参考这篇博客。

改进后的python文件创建方法

通过fdopen这个库以及特殊的权限指定,我们可以设置生成文件的访问权限,以下直接展示一个python代码案例:

# fdopen-test.py import os import stat file_name = 'test2.txt' flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL mode = stat.S_IRUSR | stat.S_IWUSR with os.fdopen(os.open(file_name, flags, mode), 'w') as file: file.write('hello world!')

执行之后我们可以发现,当前目录下生成了一个名为test2.txt的文件,其权限配置为600, 对照于我们在代码中设置的mode = stat.S_IRUSR | stat.S_IWUSR。这里我们先对其中的一些参数作一个解释:os.O_WRONLY表示以只写的方式打开,os.O_CREAT表示创建并打开一个新文件,os.O_EXCL表示如果文件已存在则报错。而mode中所配置的权限分别对应rwx配置,其中USR,GRP,OTH又分别对用户、用户组、其他用户进行了细分的配置,从而我们就可以通过改变mode参数来实现所有种类的权限配置。

我们可以尝试将上述用例中的mode作一个调整,比如添加一个可执行权限变为700:

# fdopen-test.py import os import stat file_name = 'test3.txt' flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL mode = stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR with os.fdopen(os.open(file_name, flags, mode), 'w') as file: file.write('hello world!')

又或者,我们需要为用户组里的其他用户添加可访问权限,比如640权限:

# fdopen-test.py import os import stat file_name = 'test4.txt' flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL mode = stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP with os.fdopen(os.open(file_name, flags, mode), 'w') as file: file.write('hello world!')

甚至我们也可以写出系统原生的644文件权限:

# fdopen-test.py import os import stat file_name = 'test5.txt' flags = os.O_WRONLY | os.O_CREAT | os.O_EXCL mode = stat.S_IRUSR | stat.S_IWUSR | stat.S_IRGRP | stat.S_IROTH with os.fdopen(os.open(file_name, flags, mode), 'w') as file: file.write('hello world!')

最后,让我们一起看下上面这些python示例执行后得到的结果:

[dechin@dechin-manjaro os_security]$ ll 总用量 28 -rw-r--r-- 1 dechin dechin 269 1月 25 14:58 fdopen-test.py -r--r----- 1 dechin dechin 84 1月 25 14:11 file-test.py -rw-r--r-- 1 dechin dechin 12 1月 25 13:44 test1.txt -rw------- 1 dechin dechin 12 1月 25 14:44 test2.txt -rwx------ 1 dechin dechin 12 1月 25 14:48 test3.txt -rw-r----- 1 dechin dechin 12 1月 25 14:56 test4.txt -rw-r--r-- 1 dechin dechin 12 1月 25 14:58 test5.txt

从结果中我们可以看出,所有产生的文件test*.txt都按照我们预期的文件权限配置生成,到这里我们就完成了所有预期的目标。

总结概要

使用python进行文件的创建和读写时,常规的内置函数open得到的结果会是一个644权限的文件,这不一定能够满足很多对安全性需求较高的执行环境的要求。因此我们可以通过fdopen来对所创建的文件进行进一步的权限约束,具体的操作方法可以在mode中定义一系列的权限配置,比如带有USR的表示当前用来执行python文件的用户,带有GRP的表示用来执行python文件的整个用户组,而OTH则表示其他的所有的用户。这当中尤其是OTH这个选项往往是不必要开放的权限,我们也可以根据具体的场景需求对创建的文件权限进行配置。这里还有一点补充介绍的是,os.O_EXCL这个指令的开启表示如果存在同名文件就无法创建,需要先使用os.remove操作删除原文件后再进行新的文件操作,避免文件权限被覆盖或者重用,从而导致创建的新文件权限配置与我们所预期的不符合。

参考链接
  1. fdopen使用方法的问答
  2. os.open()各配置参数解释
版权声明

本文首发链接为:https://www.cnblogs.com/dechinphy/p/fdopen.html
作者ID:DechinPhy
更多原著文章请参考:https://www.cnblogs.com/dechinphy/

,

栏目热文

python写文件指定权限(python写入txt文件权限问题)

python写文件指定权限(python写入txt文件权限问题)

读文件当我们在工作中需要从文件中获取内容的时候,我们可以使用Python的内置方法open来完成。第一步:打开文件f=o...

2024-01-03 08:22:58查看全文 >>

消逝的光芒赏金遗愿在哪里(消逝的光芒赏金任务奖励在哪领)

消逝的光芒赏金遗愿在哪里(消逝的光芒赏金任务奖励在哪领)

Techland 宣布《消逝的光芒 2》的冬季故事更新,为地图带来了新的装备、敌人、支线活动和季节性变化。Stay Hu...

2024-01-03 08:21:19查看全文 >>

消逝的光芒遗愿子弹用光怎么办(消逝的光芒子弹不够用怎么办)

消逝的光芒遗愿子弹用光怎么办(消逝的光芒子弹不够用怎么办)

同等水平下人类是永远要比猎手强的。萌新猎手打萌新人类(有段位机制保证你遇到的水平不会非常高,炸鱼当我没说),萌新非常容易...

2024-01-03 08:25:08查看全文 >>

vivo手机相机默认打开方式怎么改(vivo手机怎么设置为原相机)

vivo手机相机默认打开方式怎么改(vivo手机怎么设置为原相机)

现在的手机都有专业摄影模式,这对于摄影爱好者来说无疑提升了手机的可玩性,用专业模式能够拍摄更多的画面效果。但是很多摄友对...

2024-01-03 08:46:31查看全文 >>

毕业生登记表社会实践经历200字(毕业生登记表社会实践都写什么)

毕业生登记表社会实践经历200字(毕业生登记表社会实践都写什么)

你总是喜欢把事情拖到第二天,你不能总是这么拖了,有一天,你会有很多事情要做,你的余生都不够你用。社会实践下面是原创文章网...

2024-01-03 08:13:50查看全文 >>

python修改文件的三种方式(python一键更改文件内容)

python修改文件的三种方式(python一键更改文件内容)

大家好,我是杨数Tos,这是《从零基础到大神》系列课程的第35篇文章,第二阶段的课程:Python基础知识:Python...

2024-01-03 08:13:58查看全文 >>

python设置多个文件夹权限(python中怎么加入多个文件夹)

python设置多个文件夹权限(python中怎么加入多个文件夹)

1. 介绍1.1 介绍今天福哥带着大家来学习Python读写文件的方法,虽然现阶段做项目需要用到文件操作的情况不多了,但...

2024-01-03 08:05:24查看全文 >>

python 文件路径设置(python怎么输入文件路径)

python 文件路径设置(python怎么输入文件路径)

引言python中的路径是一个很重要的概念,但是很多同学对它一知半解。在没有出问题的时候,我们可以撇开这个概念顺利运行程...

2024-01-03 08:06:54查看全文 >>

python怎么修改文件权限(python怎样更改文件目录)

python怎么修改文件权限(python怎样更改文件目录)

小朋友们好,大朋友们好!我们今天学习高级文件操作,要学习的内容如下:高级文件操作删除文件重命名文件和目录获取文件基本信息...

2024-01-03 08:20:55查看全文 >>

python修改文件目录(python怎么修改文件中的部分内容)

python修改文件目录(python怎么修改文件中的部分内容)

在 Python 中,可以使用 os 模块来进行目录和文件的删除操作。具体而言,可以使用 os.remove() 函数来...

2024-01-03 08:07:32查看全文 >>

文档排行