50

这是我的问题,

在 Windows 中,我正在制作一个 zip 文件,其中有一个应该在 Linux 中执行的文本 .sh 文件。另一端的用户在 Linux 中打开 zip 文件并尝试执行 .sh 文件,但执行权限已消失。所以用户必须手动完成(就像这里解释的:添加执行权限

我如何在 Windows 中制作 .sh 可执行文件并将其添加到 zip 文件中,以便当 zip 文件在 linux 中打开时 .sh 文件仍保留其执行权限(这样用户不必手动执行)

4

5 回答 5

49

据我所知,Linux 中的权限系统是以这样一种方式设置的,以防止您试图完成的事情。

我认为您能做的最好的事情是为您的 Linux 用户提供一个自定义的解压缩单线以在提示符下运行:

unzip zip_name.zip && chmod +x script_name.sh

如果有多个脚本需要授予执行权限,请编写grant_perms.sh如下:

#!/bin/bash
# file: grant_perms.sh

chmod +x script_1.sh
chmod +x script_2.sh
...
chmod +x script_n.sh

(对于 chmod,您可以将脚本全部放在一行中,但我发现单独的行更容易在 vim 和 shell 脚本命令中使用。)

现在你的解压缩单线变成:

unzip zip_name.zip && source grant_perms.sh

请注意,由于您source用于运行grant_perms.sh,因此不需要执行权限

于 2012-11-01T21:03:46.460 回答
8

ZIP 文件格式确实允许存储权限位,但 Windows 程序通常会忽略它。然而,Cygwin 上的zip实用程序确实保留了 x 位,就像它在 Linux 上一样。如果您不想使用 Cygwin,您可以获取源代码并对其进行调整,以便所有 *.sh 文件都设置可执行位。或者写一个像这里解释的脚本

于 2013-05-13T09:36:40.863 回答
3

这可以使用Info-Zip开源 Zip 实用程序来实现。如果使用-X参数运行unzip,它将尝试保留原始权限。如果源文件系统是 NTFS 而目标文件系统是 Unix 系统,它将尝试从一个文件系统转换到另一个文件系统。我现在没有可用的 Windows 系统来测试翻译,所以你必须试验哪个组需要被授予执行权限。类似于“用户”或“任何用户”

于 2012-11-01T21:14:01.820 回答
0

Use my windows command line utility zip_exec.zip to set the executable flag for linux/unix and mac (tested on files created with Windows Explorer and 7zip). The cpp source is also available. I searched the internet a lot before making my own utility. It can be modified to set any file attribute.

于 2021-07-07T21:59:53.963 回答
-3

这是不可能的。Linux 权限和 windows 权限不转换。它们是特定于机器的。允许在文件到达目标系统之前对其设置权限将是一个安全漏洞。

于 2012-11-01T21:04:50.407 回答