Ubuntu环境下Python自定义库导入的权限配置问题咨询
核心问题解答
1. Python导入函数是否必须要求对应文件具备读权限?
纯解释型Python的导入流程,强制要求被导入的模块文件对当前运行Python进程的用户具备读权限。
- 原理逻辑:Python解释器导入模块时,需要先将目标文件的全部内容加载到内存,再完成语法解析、编译字节码、加载执行的全流程。如果没有文件读权限,解释器连文件内容都无法获取,自然不可能完成导入。
- 这也是你配置771权限后导入失败的核心原因:递归设置771权限时,不光对目录生效,对目录下的文件也同步设置了权限——771对文件的权限位意味着“其他用户仅具备执行权,无读、写权限”,Python解释器拿不到文件内容,直接抛出权限错误。而.py源文件本身根本不需要执行权限(它是被解释器读取加载的,不是作为可执行程序直接运行的),这个配置从原理上就不可能支持导入。
2. 如何配置实现Guest用户可正常导入函数但无法查看源码?
首先要明确一个边界:如果直接用.py源文件做权限配置,这个需求是不可能实现的——只要给Python进程开放文件读权限,Guest用户就可以通过cat、vim等工具直接查看源码;如果关闭读权限,Python进程本身也无法加载文件,导入会直接失败。
要突破这个边界,需要把“给用户读源码的权限”和“Python进程加载模块的需求”拆解开,可行的落地方案按实现难度从低到高排序:
- 方案一:用编译后的.pyc字节码替代源文件
操作步骤:- 以Admin用户身份进入
/home/admin/libary_folder/目录,用同版本Python编译生成独立的pyc文件:python3 -O -m compileall -b custom_lib.py,执行完成后会在当前目录生成custom_lib.pyc文件 - 将原
custom_lib.py源文件权限设置为600(仅Admin用户具备读、写权限,其他用户完全无访问权限) - 将生成的
custom_lib.pyc文件权限设置为644(所有用户具备读权限) - 将上级目录
/home/admin/libary_folder/的权限设置为711(Admin用户具备全权限,其他用户仅具备目录进入权限,不具备列目录内容的权限)
原理:Python导入模块时,只要目录下存在和源文件同名、版本匹配的.pyc字节码文件,就可以直接跳过源文件加载字节码完成导入,这个过程完全不需要读取.py源文件的权限。而Guest用户因为没有原.py的读权限,也无法列目录内容,既看不到源码文件,也无法读取源码内容,只能完成模块导入。
- 以Admin用户身份进入
- 方案二:编译为二进制动态链接库
如果对源码防护强度要求更高,可以用Cython将custom_lib.py编译为二进制格式的.so文件。这类文件是机器可执行的二进制内容,不存在可直接阅读的源码,只要给其他用户开放读权限,Python就可以像加载普通py文件一样完成导入,反向还原的难度远高于pyc文件。
过往配置的问题复盘
- 首次配置775权限时,因为给所有用户开放了.py源文件的读权限,所以Guest可以正常导入,但也可以直接读取源码,这个结果完全符合Linux权限的逻辑规则
- 第二次配置771权限时,混淆了目录权限和文件权限的生效范围:目录的执行权限是允许用户进入目录访问已知路径的文件,文件的读权限是允许用户获取文件内容。你递归设置771权限时,把文件的读权限也关掉了,才导致导入失败。
内容的提问来源于stack exchange,提问作者whcho
相关产品推荐
相关产品推荐

