我刚刚通过 cygwin 的 wget 下载了一个可执行文件,但发现无法执行它。
在 cygwin 中我得到
$ ./clink_0.4.4_setup.exe
-bash: ./clink_0.4.4_setup.exe: Permission denied
当我尝试从资源管理器中执行它时,我得到了
Windows 无法访问指定的设备、路径或文件。您可能没有适当的权限来访问该项目。
这似乎很清楚 - 在 Linux/Unix 中,我会这样做chmod +x
,而且确实在这里也有效。但我认为 Windows 没有“可执行”位。我可以想象 cygwin 将其权限存储在备用数据流中,并且可以阻止我执行它,但它如何在 cygwin 之外强制执行这一点?我在文件的属性中找不到任何明显的东西(在资源管理器中)。
答案1
chmod +x
在 cygwin 中如何工作?
你需要阅读全部的第 3 章 使用 Cygwin-POSIX 帐户、权限和安全才能彻底理解这一点。
以下是一些摘录。
POSIX 帐户、权限和安全
本节讨论如何在 Cygwin 中利用 Windows 安全模型来实现 POSIX 帐户信息、类似 POSIX 的权限,以及如何使用 Windows 身份验证模型允许 cygwin 应用程序以类似 POSIX 的方式切换用户。
类似 POSIX 的文件和目录权限的设置由挂载选项 (no)acl 控制,默认情况下设置为 acl。
我们先来简单介绍一下。请注意,这个概述必须简短。如果您想了解有关 Windows 安全模型的更多信息,请参阅 MSDN 文档中的访问控制文章。
本文不讨论 POSIX 概念,尤其是 POSIX 安全模型,但假定读者能够理解。如果您不了解 POSIX 安全模型,请在网上搜索初学者文档。
Windows 安全性简要概述
在 Windows 安全模型中,几乎任何“对象”都是可保护的。“对象”包括文件、进程、线程、信号量等。
每个对象都附带一个数据结构,称为“安全描述符”(SD)。SD 包含控制谁可以访问对象以及确定他们可以对对象执行什么操作所需的所有信息。对象的 SD 由五部分组成:
控制此 SD 的多个方面的标志。这里不讨论。
对象所有者的 SID。
对象所有者组的 SID。
“访问控制条目”(ACE)列表,称为“自由访问控制列表”(DACL)。
另一个 ACE 列表称为“安全访问控制列表”(SACL),这与我们的目的无关。我们在此忽略它。
每个 ACE 都包含一个所谓的“安全标识符”(SID) 和其他内容,稍后会解释。我们先来谈谈 SID。
SID 是用户、组、计算机和 Active Directory (AD) 域的唯一标识符。SID 基本上与 POSIX 用户 ID (UID) 和组 ID (GID) 相当,但更复杂,因为它们在多台机器或域中是唯一的。SID 是多个数值的结构。有一种方便的惯例来输入 SID,即用连字符分隔的数字字段字符串。
...
文件权限
在 NTFS 上,如果未为挂载点指定 noacl 挂载选项,Cygwin 将像在 POSIX 系统上一样设置文件权限。基本上,这是通过定义具有匹配的所有者和组 SID 的安全描述符以及包含所有者、组和“所有人”(代表 POSIX 所称的“其他人”)的 ACE 的 DACL 来完成的。
尝试将 POSIX 权限模型映射到 Windows 权限模型时只存在一个问题。
“正确” ACL 的定义存在漏洞,导致不允许某个 POSIX 权限设置。官方文档简要解释如下:
系统会根据用户的所有 ACE 以及用户所属的所有组检查所请求的权限。这些用户和组访问允许的 ACE 中授予的权限会累积起来,结果集就是该用户针对该对象授予的权限集。
ACE 的顺序很重要。系统按顺序读取它们,直到任何单个请求的权限被拒绝或所有请求的权限都被授予。当满足此条件时,读取停止。后面的 ACE 不予考虑。
所有拒绝访问的 ACE 都应位于允许访问的 ACE 之前。遵循此规则的 ACL 称为“规范的”。
请注意,最后一条规则是偏好或正确性定义。它不是绝对要求。所有 Windows 内核都会正确处理 ACL,无论允许和拒绝 ACE 的顺序如何。第二条规则未修改以按首选顺序获取 ACE。
不幸的是,Windows 资源管理器文件属性对话框中的安全选项卡坚持要将 ACE 的顺序重新排列为规范顺序,然后您才能读取它们。谢天谢地,如果按下“取消”按钮,排序顺序将保持不变。但千万别想着按“确定”……
规范 ACL 无法反映 POSIX 权限的每种可能组合。例如:
rw-r-xrw-
好的,这是第一次尝试创建匹配的 ACL,假设 Windows 权限只有三位,与 POSIX 权限相同:
UserAllow: 110 GroupAllow: 101 OthersAllow: 110
嗯,因为允许权限的积累,用户可以执行,因为组可以执行。
第二次尝试:
UserDeny: 001 GroupAllow: 101 OthersAllow: 110
现在用户可以读取和写入,但不能执行。好了吗?没有!不幸的是,该组现在可以写入,因为其他人也可以写入。
第三次尝试:
UserDeny: 001 GroupDeny: 010 GroupAllow: 001 OthersAllow: 110
现在,群组可能无法按预期写入,但不幸的是,用户也可能不再写入。该如何解决这个问题?根据规范顺序,UserAllow 必须遵循 GroupDeny,但很容易看出,这个问题永远无法通过这种方式解决。
唯一的机会:
UserDeny: 001 UserAllow: 010 GroupDeny: 010 GroupAllow: 001 OthersAllow: 110
再次强调:这适用于所有现有版本的 Windows NT,在撰写本文时至少从 Windows XP 到 Server 2012 R2。只有 GUI 无法(或不愿意)处理该命令。
进一步阅读
答案2
Cygwin 尝试模拟文件权限。Windows 确实有类似的安全描述符:遍历目录/执行文件实际上是一种可以授予或拒绝任何用户或组的权限;检查安全选项卡。