我正在使用 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
但这不起作用。我可以更改用户和其他人的权限。似乎组的权限级别与用户的权限级别保持一致?
我遇到了与您类似的问题,并且我使用的是 NTFS 文件系统,因此 Keith Thompson 的回答并没有为我解决。
我将文件的组所有者更改为Users
组:
chown :Users filename
之后,我可以使用chmod
. 就我而言,因为它是 OpenSSH 的 RSA 密钥,所以我做了:
chmod 700 filename
它奏效了。在 Cygwin 中,默认情况下您会获得两个组,Root
组和Users
组。我想添加另一个组,但我无法使用我在 Linux 上使用的工具来完成。出于这个原因,我只使用了该Users
组。
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 窗口,然后重新打开它们。
实验表明,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'的单个字母。
像以前的答案一样,未被识别的组会导致此类问题。它主要发生在 Windows 域中。
修复它的最简单方法是重新生成您的/etc/passwd
和/etc/group
文件(-d
域用户需要参数):
mkpasswd -l -d > /etc/passwd
mkgroup -l -d > /etc/group
关闭并再次启动 Cygwin。
这对我来说是一个非常烦人的问题。就我而言,user135348 的解决方案效果最好。该chown :Users -R
方法最大的问题是每次创建新文件时,都会将其分配给未知的 gid 1049120。不断更改文件 gid 非常令人沮丧。
我也试过mkgroup
了,但在我的情况下它不起作用:我的 gid 是 1049120。
根据将Windows SID 映射到 POSIX uid/gid 值中解释的规则 :0x100000 偏移量用于来自机器主域的帐户。尝试从 1049120 中删除相同的偏移量,您会得到 544,它是内置管理员组的 RID。
此帐户不是本地管理员组的成员;我们使用 SuRun 授予管理员权限而不提供凭据。在这种情况下,mkgroup 未能生成所有可能的 gid。
编辑组文件并添加自定义组名似乎总是可以轻松解决问题。
从域远程工作并使用 cygserver 时,我遇到了这个问题。
运行ls -l
显示数字组 id 而不是组名。
我停止了 cygserver、net stop "CYGWIN cygserver
和其他 Cygwin 进程,然后ls -l
再次运行,然后组名正确显示。
我猜 cygserver 持有不完整的域组信息。
重新启动 cygserver 后,系统继续正常工作。
您必须在您的用户所属的 Windows 系统上指定组名。
所以我只是这样做了:
chown -R ONEX:Users ~/*
您可以在此处找到您的用户名和组: