chmod无法更改Cygwin的组权限

时间:2013-06-13 16:12:16

标签: cygwin

我正在使用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 

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

7 个答案:

答案 0 :(得分:34)

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

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

chown :Users filename

执行此操作后,我可以使用chmod将群组权限更改为我的意愿。就我而言,由于它是OpenSSH的RSA密钥,我做了:

chmod 700 filename

它有效。在Cygwin中,默认情况下会有两个组,Root组和Users组。我想添加另一个组,但我无法使用我以前在Linux上使用的工具。出于这个原因,我只使用了Users组。

答案 1 :(得分:4)

Cygwin并不喜欢他们不知道的群组所拥有的文件。 不幸的是,这种情况在Cygwin中经常发生,特别是如果您的PC处于Windows域中且事情不断变化。 我还通过外部驱动器在两台PC之间同步我的文件,并且不同PC之间的uid / gids是不同的,因此这是问题的根源。

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

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

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

答案 2 :(得分:2)

实验表明,chmod可以正确地更改Cygwin下的群组权限。

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

在现代版本的Windows上,大多数硬盘驱动器都被格式化为使用NTFS,这为chmod提供了足够的支持。但外部USB驱动器通常使用FAT32,它没有相同的能力来表示权限。 Cygwin层虽然可以伪造POSIX语义,但它只能做很多事情。

尝试

$ df -T .

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

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


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


Cygwin使用chmod的GNU Coreutils版本。此,

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'的零个或多个字母,或者a   来自'ugo'集的单个字母。

答案 3 :(得分:2)

与之前的答案一样,未被识别的群体会导致此类问题。它主要发生在Windows域名中。

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

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

关闭并再次启动Cygwin。

答案 4 :(得分:0)

对我来说,这是一个非常烦人的问题。在我的情况下,user135348的解决方案效果最好。 chown :Users -R方法的最大问题是每次创建新文件时,它都会被分配给未知的gid 1049120.继续更改文件gid非常令人沮丧。

我也尝试了mkgroup,但在我的情况下它没有用:我的gid是1049120。

基于 Mapping Windows SIDs to POSIX uid/gid values 中说明的规则:: 0x100000 offset用于来自计算机主域的帐户。 尝试从1049120中删除相同的偏移量,得到544,这是内置管理员组的RID。

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

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

答案 5 :(得分:0)

从域远程工作并使用cygserver时遇到此问题。

正在运行ls -l显示数字组ID而不是组名。

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

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

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

答案 6 :(得分:-1)

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

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

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

Image