17

我正在使用 Cygwin 并尝试使用chmod更改组访问权限,例如

$ls -l id_rsa
-rwxrwxr-- 1 None 1679 Jun 13 10:16 id_rsa 

$ chmod g= id_rsa 

$ ls -l id_rsa 
-rwxrwxr-- 1 None 1679 Jun 13 10:16 id_rsa 

但这不起作用。我可以更改用户和其他人的权限。似乎组的权限级别与用户的权限级别保持一致?

4

7 回答 7

37

我遇到了与您类似的问题,并且我使用的是 NTFS 文件系统,因此 Keith Thompson 的回答并没有为我解决。

我将文件的组所有者更改为Users组:

chown :Users filename

之后,我可以使用chmod. 就我而言,因为它是 OpenSSH 的 RSA 密钥,所以我做了:

chmod 700 filename

它奏效了。在 Cygwin 中,默认情况下您会获得两个组,Root组和Users组。我想添加另一个组,但我无法使用我在 Linux 上使用的工具来完成。出于这个原因,我只使用了该Users组。

于 2013-11-04T23:39:26.340 回答
4

Cygwin 不喜欢文件被它不知道的组所拥有。不幸的是,这种情况在 Cygwin 中经常发生,尤其是当您的 PC 位于情况不断变化的 Windows 域中时。我还通过外部驱动器在两台 PC 之间同步我的文件,并且不同 PC 之间的 uids/gids 是不同的,所以这是问题的根源。

如果您ls -l看到的是数字组 id 而不是组名,这意味着 Cygwin 不知道该 gid - 即它不在 中/etc/group,并且 Cygwin 也无法从 Windows 查询它。您可以通过运行来确认这一点getent group <gid>,其中<gid>是数字组 ID。

要修复它,您可以使用chgrp更改所有受影响文件/目录的组,如上面接受的答案中所述,或者/etc/group使用任何未使用的组名(例如Users2)为未知 gid 创建一个条目。

完成此操作后,可能需要关闭所有 Cygwin 窗口,然后重新打开它们。

于 2016-06-08T03:14:59.070 回答
2

实验表明,chmod在 Cygwin 下更改组权限确实可以正常工作。

该实验使用 NTFS 分区上的文件。Cygwin 在 Windows 之上实现了一个 POSIX 层,但它最终仍然使用 Windows 本身的特性,以及特定文件系统实现的特性。

在现代版本的 Windows 上,大多数硬盘驱动器都被格式化为使用 NTFS,它为chmod. 但是外部 USB 驱动器通常使用 FAT32,它没有相同的能力来表示权限。Cygwin 层尽可能地伪造 POSIX 语义,但它只能做这么多。

尝试

$ df -T .

如果它表明您使用的是 FAT32 文件系统,那可能就是问题所在。解决方案是将文件存储在 NTFS 文件系统上。一个名为的文件可能是一个 SSH 私钥,无论如何id_dsa都需要存储它。$HOME/.ssh

您的主目录是否在 FAT32 分区上?我记得,最新版本的 Windows(“最近”意味着过去 10 年或更长时间)能够将 FAT32 文件系统转换为 NTFS。


该答案的其余部分是对问题的原始版本的回应,该版本的chmod命令中有错字。


Cygwin 使用 GNU Coreutils 版本的chmod. 这个,

chmod g=0 fileName

不是正确的语法。我得到:

$ chmod g=0 fileName
chmod: invalid mode: `g=0'
Try `chmod --help' for more information.

(这是在 Linux 上,不是 Cygwin,但应该是一样的。)

要关闭所有组权限,这应该有效:

$ chmod g= fileName
$ ls -l fileName 
-rw----r-- 1 kst kst 0 Jun 13 10:31 fileName

要查看chmod文档:

$ info coreutils chmod

要查看有关符号文件模式的文档:

$ info coreutils Symbolic

符号模式的格式为:

 [ugoa...][+-=]PERMS...[,...]

其中PERMS是来自集合'rwxXst'的零个或多个字母,或者来自集合'ugo'的单个字母。

于 2013-06-13T17:40:49.583 回答
1

像以前的答案一样,未被识别的组会导致此类问题。它主要发生在 Windows 域中。

修复它的最简单方法是重新生成您的/etc/passwd/etc/group文件(-d域用户需要参数):

mkpasswd -l -d > /etc/passwd
mkgroup  -l -d > /etc/group

关闭并再次启动 Cygwin。

于 2016-06-27T07:32:04.157 回答
0

这对我来说是一个非常烦人的问题。就我而言,user135348 的解决方案效果最好。该chown :Users -R方法最大的问题是每次创建新文件时,都会将其分配给未知的 gid 1049120。不断更改文件 gid 非常令人沮丧。

我也试过mkgroup了,但在我的情况下它不起作用:我的 gid 是 1049120。

根据将Windows SID 映射到 POSIX uid/gid 值中解释的规则 :0x100000 偏移量用于来自机器主域的帐户。尝试从 1049120 中删除相同的偏移量,您会得到 544,它是内置管理员组的 RID。

此帐户不是本地管理员组的成员;我们使用 SuRun 授予管理员权限而不提供凭据。在这种情况下,mkgroup 未能生成所有可能的 gid。

编辑组文件并添加自定义组名似乎总是可以轻松解决问题。

于 2016-10-23T15:54:04.827 回答
0

从域远程工作并使用 cygserver 时,我遇到了这个问题。

运行ls -l显示数字组 id 而不是组名。

我停止了 cygserver、net stop "CYGWIN cygserver和其他 Cygwin 进程,然后ls -l再次运行,然后组名正确显示。

我猜 cygserver 持有不完整的域组信息。

重新启动 cygserver 后,系统继续正常工作。

于 2017-09-17T06:52:36.450 回答
-1

您必须在您的用户所属的 Windows 系统上指定组名。

所以我只是这样做了: chown -R ONEX:Users ~/*

您可以在此处找到您的用户名和组:

图片

于 2018-01-21T07:27:49.353 回答