Python文件权限中的Zipfile

2023-12-11

i used zipfilelib 从 zip 中提取文件,现在解压目录后我发现我的文件的权限已损坏,

import zipfile
fh = open('sample.zip', 'rb')
z = zipfile.ZipFile(fh)
print z.namelist()
for name in z.namelist():
    z.extract(name, '/tmp/')
fh.close()

但是当我使用linux解压工具就不会出现这个问题 我尝试使用

os.system('unzip sample.zip')

但我仍然想这样做zipfile


相关的 Python 问题提供了一些关于该问题最初存在的原因的见解:https://bugs.python.org/issue18262 and https://bugs.python.org/issue15795

此外,原始 Zip 规范可以在这里找到:https://pkware.cachefly.net/webdocs/casestudies/APPNOTE.TXT

重要的部分是:



4.4.2 version made by (2 bytes)

        4.4.2.1 The upper byte indicates the compatibility of the file
        attribute information.  If the external file attributes 
        are compatible with MS-DOS and can be read by PKZIP for 
        DOS version 2.04g then this value will be zero.  If these 
        attributes are not compatible, then this value will 
        identify the host system on which the attributes are 
        compatible.  Software can use this information to determine
        the line record format for text files etc.  

        4.4.2.2 The current mappings are:

         0 - MS-DOS and OS/2 (FAT / VFAT / FAT32 file systems)
         1 - Amiga                     2 - OpenVMS
         3 - UNIX                      4 - VM/CMS
         5 - Atari ST                  6 - OS/2 H.P.F.S.
         7 - Macintosh                 8 - Z-System
         9 - CP/M                     10 - Windows NTFS
        11 - MVS (OS/390 - Z/OS)      12 - VSE
        13 - Acorn Risc               14 - VFAT
        15 - alternate MVS            16 - BeOS
        17 - Tandem                   18 - OS/400
        19 - OS X (Darwin)            20 thru 255 - unused
...
4.4.15 external file attributes: (4 bytes)

       The mapping of the external attributes is
       host-system dependent (see 'version made by').  For
       MS-DOS, the low order byte is the MS-DOS directory
       attribute byte.  If input came from standard input, this
       field is set to zero.

  

这意味着外部文件属性是系统特定的。解释不同系统的外部文件属性可能会使情况变得更糟。如果我们只关心 UNIX,我们可以检查ZipInfo.created_system并将其与3(对于 UNIX)。不幸的是,该规范并不能帮助我们进一步解释如何解释外部属性。

这个维基里有一些东西http://forensicswiki.org/wiki/Zip#External_file_attributes



The external attributes UNIX (3) is 4 bytes of size and consists of:

╔═════════╦══════════╦════════╦═══════════════════════════════════════════════════════╗
║ Offset  ║  Size    ║ Value  ║                      Description                      ║
╠═════════╬══════════╬════════╬═══════════════════════════════════════════════════════╣
║      0  ║ 1        ║        ║ FAT (MS-DOS) file attributes.                         ║
║      1  ║ 1        ║        ║ Unknown                                               ║
║      2  ║ 16 bits  ║        ║ The UNIX mode (or permission).                        ║
║         ║          ║        ║ The value seems to be similar to stat.st_mode value.  ║
╚═════════╩══════════╩════════╩═══════════════════════════════════════════════════════╝
  

虽然这是相当观察性的,但这似乎是共识。

将其放在一起:

from zipfile import ZipFile

ZIP_UNIX_SYSTEM = 3

def extract_all_with_permission(zf, target_dir):
  for info in zf.infolist():
    extracted_path = zf.extract(info, target_dir)

    if info.create_system == ZIP_UNIX_SYSTEM:
      unix_attributes = info.external_attr >> 16
      if unix_attributes:
        os.chmod(extracted_path, unix_attributes)

with ZipFile('sample.zip', 'r') as zf:
  extract_all_with_permission(zf, '/tmp')

可能会出现一个问题,为什么我们首先要保留权限。有些人可能敢说我们只想保留可执行标志。在这种情况下,一个稍微安全的选择可能是仅恢复文件的可执行标志。

from zipfile import ZipFile
from stat import S_IXUSR

ZIP_UNIX_SYSTEM = 3

def extract_all_with_executable_permission(zf, target_dir):
  for info in zf.infolist():
    extracted_path = zf.extract(info, target_dir)

    if info.create_system == ZIP_UNIX_SYSTEM and os.path.isfile(extracted_path):
      unix_attributes = info.external_attr >> 16
      if unix_attributes & S_IXUSR:
        os.chmod(extracted_path, os.stat(extracted_path).st_mode | S_IXUSR)

with ZipFile('sample.zip', 'r') as zf:
  extract_all_with_executable_permission(zf, '/tmp')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python文件权限中的Zipfile 的相关文章

随机推荐

  • 为什么同源策略不阻止 POST 请求? [复制]

    这个问题在这里已经有答案了 据我所知 跨源 简单 请求 例如 GET 和 POST 始终是允许的 但您只是无法查看响应 并且 PUT DELETE 会被阻止 或者如果您的浏览器支持 CORS 则会进行预检 我明白 只要响应被阻止 允许发送
  • 如何从文本文件中回显随机行

    我的文本文件格式是 这是第一行 这是第二行 这是第三行 文本文件中可能有更多行 如何使用 php ini 在每次刷新时从文本文件中回显一行随机行 感谢所有评论 谢谢 我们谈论的文件有多大 简单的方法是将整个文件作为字符串数组加载到内存中 并
  • 方法隐藏是多态性的一种形式吗?

    多态性是采取多种形式的能力 方法重写是运行时多态性 我的问题是 Java中有静态多态之类的东西吗 方法隐藏可以被视为多态性的一种形式吗 In this 问题的答案 据说静态方法不是多态的 这是什么原因呢 如果我们运行这个测试 class A
  • 用于转置 double[][] 矩阵的紧凑流表达式

    我想转置一个double 具有最紧凑和最有效的表达方式的矩阵 现在我有这个 public static Function
  • 使用 ASP.NET MVC 打印元标记时出现问题

    我正在尝试根据模型中的数据在视图中创建元标记 我的视图代码如下所示 但我的输出看起来像这样 meta name description content lt Html Encode Model MetaDescription gt gt 我
  • 删除 SQL Server 2005 全文索引中的干扰词

    在一个非常典型的场景中 我的 Web 应用程序上有一个 搜索 文本框 其中将用户输入直接传递到存储过程 然后使用全文索引搜索两个表中的两个字段 这两个表使用适当的键连接 我正在使用 CONTAINS 谓词来搜索字段 在传递搜索字符串之前 我
  • 将多行多列值显示为单行多列值

    我必须在一行中显示单个人的多种收入 收入类型和雇主名称值 因此 如果 A 拥有来自三个不同来源的三种不同收入 id Name Employer IncomeType Amount 123 XYZ ABC Inc EarningsformJo
  • xml_parse 无内存错误 PHP

    我在使用 xml parse 时遇到了一个奇怪的错误 我的脚本通过 xml parse 函数在 XML 文件的最后一行返回 无内存 错误 仅当文件大小大于 10Mb 时才会发生这种情况 少一点也是可以接受的 但我有 3Gb 可用于 PHP
  • 将其他文件包含在数据流中

    我的数据流使用 sql文件 该文件包含一个查询 它位于名为的目录中queries 我需要将此文件与我的数据流一起上传 我发现使用了一个manifest in文件 但据我所知 它没有做任何事情 我把这个文件称为MANIFEST in在我的根目
  • Xcode 配置文件位置

    Xcode 8 3 3 中的配置文件位于项目和 或文件目录中的什么位置 对于旧版本的 Xcode 它们的位置 Library MobileDevice Provisioning Profiles 配置文件不与项目一起存储 Xcode 有一个
  • 在没有 Turbolink 的 AJAX 之后在 Rails 中触发 js

    我有一个rails4应用程序 由于我不擅长 js 所以我关闭了 TURBOLINKS 我读了很多文章 但我仍然不知道如何组织我的 javascript 文件 目前我在 AJAX 附加后触发 js 代码时遇到问题 我有一个任务列表 索引页 如
  • Facebook 打开图表,过滤好友列表数组

    我希望我的应用程序能够过滤我使用开放图获得的朋友列表 登录我的网站的人只能看到他们也使用我的应用程序的朋友 我在 Quora Thumb 等许多应用程序上都注意到了这一点 如何使用 php 来完成呢 当您使用 FQL 查询时可以轻松完成us
  • 如何在 django 导航栏下拉列表中显示活动链接?

    我有一个导航栏菜单 其中包含链接列表 我想在用户位于页面上时显示活动链接 到目前为止 我已经设法使用没有这样的下拉菜单的链接来做到这一点 但我似乎无法正确使用下拉链接 如果用户位于下拉链接的页面上 则导航栏上的父链接会突出显示 如下所示 任
  • 使用 AVMutableComposition iPhone

    我正在使用下面的代码 按顺序流式传输两个视频 但它在模拟器中没有显示任何视频 它完全是空白的 另外我怎样才能找到这两个视频 例如 如果一个视频时长 2 分钟 第二个视频时长 3 分钟 现在我需要获取这些视频的总时间并进行搜索 当我将滑块滑动
  • 将注释的标题设置为当前地址

    我想获取当前位置的地址并将其设置为注释的标题 但这没有用 我认为这是因为阻塞 但我不知道如何解决它 任何帮助将不胜感激 最相关的代码如下 WhereAmIAnnotation h import
  • 将脚本插入 iFrame 的标头,而不清除 iFrame 的主体

    我希望将脚本添加到 iFrame 的标头 同时不丢失 iFrame 正文或标头中包含的所有内容 这是我现在所拥有的 它确实使用新脚本更新了 iFrame 但它会清除 iframe 中的所有内容 而不是附加我想要的内容 谢谢 乙 Find t
  • Espresso:为什么选择后旋转器不关闭?

    我有一个关于在 Spinners with Espresso 中选择项目的问题 或者更准确地说 选择有效 但之后视图断言失败 因为微调器仍然打开 假设我有一个非常简单的活动 其中包含一个微调器和一个显示选择的文本视图 如下所示 现在 我编写
  • 创建带有导航栏和后退按钮的模态视图

    我想创建一个带有导航项的模式视图 屏幕截图中的右侧视图 并且我希望它有一个 后退按钮 我的应用程序是 TabBar 应用程序 我不希望此视图有选项卡栏 但我想使用类似于 push 类型的 segue 加载上一个视图 屏幕截图中的左侧视图 我
  • 如何从自定义列表在 Room 中创建 TypeConverter?

    我做了一个 TypeConverter 但出现错误 无法为类创建转换器 models lastanime EpisodesEntityfor 方法 EpisodesApi getEpisodes 我无法完全理解如何制作 TypeConver
  • Python文件权限中的Zipfile

    i used zipfilelib 从 zip 中提取文件 现在解压目录后我发现我的文件的权限已损坏 import zipfile fh open sample zip rb z zipfile ZipFile fh print z nam