【问题标题】:Is MacOS Catalina stripping executable file permissions in zip files?MacOS Catalina 是否会剥离 zip 文件中的可执行文件权限?
【发布时间】:2020-12-14 09:24:46
【问题描述】:

我使用 OpenJDK 11 和 Apache Commons Compress 1.20 创建了一个 zip 文件,该文件由使用 Netty 服务器的 API 返回。此 zip 文件包含具有可执行文件权限 (755) 的 gradle 包装器。

-rwxr-xr-x  1 myuser  mygroup  5766 Aug 24 16:03 gradlew

我用 Commons Compress 压缩它,在 API 响应中返回它,浏览器将 zip 保存到磁盘。

如果我在 MacOS Mojave 中提取 zip 文件,gradle 包装文件看起来像这样(带有扩展文件属性列表):

ls -al@ gradlew
-rwxr-xr-x@  1 myuser  mygroup    5766 Nov 30  1979 gradlew
    com.apple.quarantine        56

好的,它已被隔离,但仍可执行。执行起来效果很好。

如果我在 MacOS Catalina 中提取 zip 文件,gradle 包装文件看起来像这样(带有扩展文件属性列表):

ls -al@ gradlew
-rw-rw-r--@  1 myuser  mygroup    5766 Nov 30  1979 gradlew
    com.apple.quarantine        57

Catalina 已删除可执行文件权限。除了解压后添加可执行文件权限,有什么办法可以规避吗?

【问题讨论】:

    标签: java zip executable macos-catalina apache-commons-codec


    【解决方案1】:

    我最近遇到了类似的问题,并在Spring Initializrsource code找到了解决方案

    简而言之,解决办法就是修改gradlew归档入口的权限,使其解压后可执行。

    这是我使用的代码示例,它在 Kotlin 上,但如果需要,可以轻松转换为 Java。

    val entry = ZipArchiveEntry(file, name)
    
    entry.unixMode = if (Files.isDirectory(path)) {
         UnixStat.DIR_FLAG or UnixStat.DEFAULT_DIR_PERM
    } else {
        UnixStat.FILE_FLAG or if (entryName == "gradlew") UnixStat.DEFAULT_DIR_PERM else UnixStat.DEFAULT_FILE_PERM
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-15
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 2011-12-27
      • 2016-10-17
      • 2011-06-09
      • 2015-12-12
      • 1970-01-01
      相关资源
      最近更新 更多