【问题标题】:Can i store unix permissions in a zip file (built with apache ant)?我可以将 unix 权限存储在 zip 文件中(使用 apache ant 构建)吗?
【发布时间】:2012-11-17 23:33:17
【问题描述】:

我正在为 Java 应用程序构建一个 linux 安装程序,最后我使用 ant 将 install.jar 和 setup.sh 放入一个 zip 文件中。

这个想法是用户解压缩 zip 文件,然后运行 ​​setup.sh,但问题是他们总是需要先 chmod setup.sh 才能给自己执行权限。

我想删除这一步,我不确定问题部分是否是:

  1. 我在 Windows 上构建
  2. 我正在使用 ant zip 任务构建
  3. 或者说 zips 不能 presreve 权限并且总是在没有 x 权限的情况下解压。

【问题讨论】:

  • 权限是文件外部的,特别是文件系统。所以,即使我不能给出一个有争议的答案,我也会投票支持 3)。另外,您希望将哪些权限从您的 Windows FS 传递到 Unix?即使 zip 支持这一点,从 windows 构建文件也是没有意义的。
  • Windows 的权限与 Unix 不同; IIRC 对于文件,它将默认为0666。或0644?。没有666那么搞笑,不知道能不能覆盖。
  • 我只是想要用户的执行权限,如果我真的需要的话,我可以在 linux 上创建 zip,但是这样可以解决它吗?

标签: java linux zip


【解决方案1】:

如果您使用 tar 文件而不是 zip 文件,它应该为您保留权限。文件的所有者和组可能不匹配,但权限位会匹配。

【讨论】:

    【解决方案2】:

    您不能将 Linux/Unix 文件权限存储在 ZIP 文件中。

    编辑(在 cmets 之后) 通过使用 ZIP 标头内的“外部属性”字段,这些属性可以存储在 ZIP 文件中。 GNU 的unzip 显然能够读取该附加字段并恢复文件权限。 我不确定这是什么时候添加到 ZIP 格式的,因为早期版本(来自 MS-DOS 世界)不支持此功能。

    TAR 格式——作为“原生”Unix/Linux 格式——被设计为包含文件属性,Ant 可以创建 TAR 文件,在所有 Linux/Unix 操作系统中保留属性。

    【讨论】:

    • 谢谢你的工作:),我唯一担心的是,当用户下载这个文件时,他们需要做'tar xvf file',这比'unzip file'更不直观
    • @PaulTaylor:对于 Unix/Linux 用户,tar 格式(通常)比 ZIP 格式更自然。
    • 实际上可以在“Extra”字段中将 Unix 权限偷运到 ZIP 文件中。见stackoverflow.com/questions/434641/…
    • @offby1:很有趣。通常的解压缩程序是否支持这一点?
    • @a_horse_with_no_name RHEL 5.3 上的“解压缩”确实如此,我知道很多:)
    【解决方案3】:

    我认为您可以使用 Apache Commons Compress 来做到这一点。

    第一段:

    访问内部和外部属性(某些 zip 实现用于存储 Unix 权限)。

    查看API 并查找setUnixMode()

    【讨论】:

    【解决方案4】:
    <shellscript shell="sh" dir="abc" failonerror="true">
                zip -ry abc.zip *
    </shellscript>
    

    上面的 ant 脚本调用一个 shell 脚本来创建 zip 存档,其中的权限保存得非常好。它适用于 Ant 1.7 及更高版本。但是我没有尝试在 Windows 上验证运行这个 ant 脚本。这在 mac 上效果很好。

    【讨论】:

      【解决方案5】:

      您不必切换到 tar 文件。我不知道为什么不了解 Ant 的人会就这个话题提供建议。

      使用 zipfileset 的 filemode 参数。记录在http://ant.apache.org/manual/Types/zipfileset.html

      【讨论】:

      • 举个具体的例子不会有什么坏处。
      【解决方案6】:

      现代 linux 发行版中的 zip/unzip 将保留文件权限。 但您需要确保 windows 中的 zip 支持这一点。

      【讨论】:

        【解决方案7】:

        要扩展 Blaine 的答案,您可以使用 <zipfileset> 子元素来指定权限:

        <zip destfile="build/MyApplication.zip" encoding="UTF-8">
        
            <zipfileset dir="${content-dir}" encoding="UTF-8"
                includes="**/setup.sh" filemode="755"/>
        
            <zipfileset dir="${content-dir}" encoding="UTF-8"
                excludes="**/setup.sh"/>
        
        </zip>
        

        【讨论】:

          猜你喜欢
          • 2011-06-17
          • 1970-01-01
          • 2012-01-10
          • 2011-04-28
          • 1970-01-01
          • 2010-10-17
          • 1970-01-01
          • 2021-08-19
          • 1970-01-01
          相关资源
          最近更新 更多