如何为Python的tarfile模块配置root权限,解决/opt路径写入报错问题
问题原因
Errno 13 Permission denied报错本质是运行Python脚本的进程没有对应路径的写入权限,tarfile模块本身没有单独配置root权限的能力,权限完全继承自启动脚本的系统用户。此外你当前的代码存在API调用错误,需要优先修正。
代码修正
tarfile.extract 方法的第一个参数是归档内部的成员文件名/成员对象,第二个参数才是解压到的目标路径,你当前参数传递顺序错误。
如果是要解压整个tar包到指定路径,推荐用extractall方法,同时可搭配set_attrs=False参数忽略归档自带的权限、所有者属性,避免解压时权限冲突,修正后的示例代码如下:
import tarfile with tarfile.open("PATH/gitconf.tar", "r") as gitlab_restore: # set_attrs=False 表示不还原归档内文件的原有权限、所有者,使用当前用户默认权限 gitlab_restore.extractall(path="/opt/destination/path", set_attrs=False)
使用with上下文管理器可以自动处理文件关闭,无需手动调用close()方法,安全性更高。
权限问题解决方案
你可以根据使用场景选择任意一种方案解决权限报错:
- 方案1:临时以root身份运行脚本
最快捷的测试方案,直接用sudo启动Python脚本即可继承root权限:sudo python3 你的脚本名称.py
注意:该方案仅推荐临时测试使用,生产环境用root运行不可信脚本存在安全风险。 - 方案2:给当前用户开放目标路径写入权限
无需每次运行脚本都加sudo,给当前用户授权目标路径的读写权限即可:- 修改路径所有者为当前用户:
sudo chown -R $USER:$USER /opt/destination/path - 若需要多用户共享访问该路径,可直接修改路径权限为775:
sudo chmod -R 775 /opt/destination/path
- 修改路径所有者为当前用户:
- 方案3:解压时忽略归档原有权限
若你已经拥有目标路径的写入权限,还是出现权限报错,通常是归档内的文件自带root专属权限位,普通用户无法还原导致,使用上面代码示例中的set_attrs=False参数即可解决该问题。
内容的提问来源于stack exchange,提问作者Siavash Fazli
相关产品推荐
相关产品推荐

