jdm*_*jdm 5 windows cygwin file-permissions
我刚刚通过 cygwin 的 wget 下载了一个可执行文件,发现我无法执行它。
在 cygwin 我得到
$ ./clink_0.4.4_setup.exe
-bash: ./clink_0.4.4_setup.exe: Permission denied
Run Code Online (Sandbox Code Playgroud)
当我尝试从资源管理器执行它时,我得到
Windows 无法访问指定的设备、路径或文件。您可能没有访问该项目的适当权限。
这似乎很清楚 - 在 Linux/Unix 中,我会chmod +x,而且确实在这里也有效。但我认为 Windows 没有“可执行”位。我可以想象 cygwin 将其权限存储在 Alternate Data Streams 中,并且可以阻止我执行它,但是它如何在 cygwin 之外强制执行此操作?我在文件的属性中找不到任何明显的东西(在资源管理器中)。
chmod +x工作?您需要阅读第 3 章的全部内容。使用 Cygwin-POSIX 帐户、权限和安全性才能完全理解这一点。
以下是一些摘录。
本节讨论如何在 Cygwin 中利用 Windows 安全模型来实现 POSIX 帐户信息、类似 POSIX 的权限,以及如何使用 Windows 身份验证模型允许 cygwin 应用程序以类似 POSIX 的方式切换用户。
类似 POSIX 的文件和目录权限的设置由挂载选项 (no)acl 控制,默认设置为 acl。
我们首先进行简短的概述。请注意,此概述必须简短。如果您想了解有关 Windows 安全模型的更多信息,请参阅 MSDN 文档中的访问控制文章。
这里不讨论 POSIX 概念,特别是 POSIX 安全模型,但假设读者能够理解。如果您不了解 POSIX 安全模型,请在网络上搜索初学者文档。
在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 称为“规范”。
请注意,最后一条规则是偏好或正确性的定义。这不是绝对的要求。无论允许和拒绝 ACE 的顺序如何,所有 Windows 内核都会正确处理 ACL。不修改第二条规则以按首选顺序获取 ACE。
不幸的是,Windows 资源管理器的文件属性对话框中的安全选项卡坚持将 ACE 的顺序重新排列为规范顺序,然后您才能读取它们。感谢上帝,如果按下“取消”按钮,排序顺序将保持不变。但别想按“确定”...
规范 ACL 无法反映 POSIX 权限的每种可能的组合。例子:
Run Code Online (Sandbox Code Playgroud)rw-r-xrw-好的,这是创建匹配 ACL 的第一次尝试,假设 Windows 权限只有三位,作为其 POSIX 对应项:
Run Code Online (Sandbox Code Playgroud)UserAllow: 110 GroupAllow: 101 OthersAllow: 110嗯,由于允许权限的累积,用户可以执行,因为组可以执行。
第二次尝试:
Run Code Online (Sandbox Code Playgroud)UserDeny: 001 GroupAllow: 101 OthersAllow: 110现在用户可以读取和写入但不能执行。更好的?不!不幸的是,该小组现在可能会写信,因为其他人可能会写信。
第三次尝试:
Run Code Online (Sandbox Code Playgroud)UserDeny: 001 GroupDeny: 010 GroupAllow: 001 OthersAllow: 110现在,该组可能不会按预期写入,但不幸的是,用户也可能不会再写入。这个问题应该如何解决呢?根据规范顺序,UserAllow 必须遵循 GroupDeny,但很容易看出,这种方式永远无法解决。
唯一的机会:
Run Code Online (Sandbox Code Playgroud)UserDeny: 001 UserAllow: 010 GroupDeny: 010 GroupAllow: 001 OthersAllow: 110再次强调:这适用于所有现有版本的 Windows NT,在撰写本文时,至少从 Windows XP 到 Server 2012 R2。只有 GUI 无法(或不愿意)处理该订单。
| 归档时间: |
|
| 查看次数: |
4026 次 |
| 最近记录: |