如何用Python向已有tar.gz添加带chmod +x权限的tmp/logger.sh?
解决向现有tar.gz添加文件并设置可执行权限的问题
你的问题出在两个地方:一是用了'w'模式打开tar.gz,这个模式会直接创建新文件并覆盖原有内容;二是没有手动设置文件的可执行权限。下面给你完整的解决方案:
核心思路
因为压缩后的tar.gz文件无法直接追加内容(压缩流的特性导致的),所以我们需要先读取原tar.gz里的所有内容,然后创建一个新的tar.gz文件,把原有内容和新文件一起打包进去,同时给新文件设置可执行权限。
完整代码示例
import tarfile import os # 原tar.gz文件路径 original_tar_path = "test.tar.gz" # 临时文件路径,避免直接覆盖原文件 temp_tar_path = "test_temp.tar.gz" # 创建新的tar.gz,先写入原有内容,再添加新文件 with tarfile.open(temp_tar_path, "w:gz") as new_tar: # 读取原有tar.gz的所有内容 with tarfile.open(original_tar_path, "r:gz") as old_tar: # 遍历原有文件/目录,逐个添加到新tar for member in old_tar.getmembers(): # 提取文件内容(目录的话extractfile返回None) file_content = old_tar.extractfile(member) new_tar.addfile(member, file_content) # 添加logger.sh到tmp/路径下,并设置可执行权限 # 获取文件的TarInfo对象(包含路径、权限等元数据) tar_info = new_tar.gettarinfo("logger.sh", arcname="tmp/logger.sh") # 设置可执行权限:0o755表示所有者读写执行,组和其他用户读执行 # 如果想保留原文件权限只加可执行,用 tar_info.mode |= 0o111 tar_info.mode = 0o755 # 将logger.sh的内容写入新tar with open("logger.sh", "rb") as f: new_tar.addfile(tar_info, f) # 用新文件替换原文件 os.replace(temp_tar_path, original_tar_path)
关键细节解释
避免覆盖原有内容:
- 不能用
'w'模式打开原文件,这个模式会直接清空并创建新文件。我们改用'r:gz'读取原文件,再用'w:gz'创建临时文件,最后替换原文件。
- 不能用
设置可执行权限:
- 通过
gettarinfo()获取文件的元数据对象TarInfo,修改它的mode属性来设置权限。 0o755是八进制权限码,对应chmod +x后的常见权限;如果只想给所有者加执行权限,可以用0o744,或者用tar_info.mode |= 0o100。
- 通过
处理目录和文件:
- 遍历原tar的所有成员时,目录的
extractfile()会返回None,直接用addfile()添加目录元数据即可,不需要内容。
- 遍历原tar的所有成员时,目录的
内容的提问来源于stack exchange,提问作者paramikoooo
相关产品推荐
相关产品推荐

