在Cygwin中,chmod无法更改组权限

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 

但是这并不起作用。我可以更改用户和其他人的权限。似乎组的权限级别与用户相同?

我在这个Super User答案中建议的使用"setfacl"命令很好用。 - Batandwa
8个回答

37

我遇到了和你类似的问题,而且我正在使用NTFS文件系统,所以Keith Thompson的答案对我没用。

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

chown :Users filename

完成这些步骤之后,我可以使用chmod更改文件组权限。在我的情况下,由于它是用于OpenSSH的RSA密钥,我执行了以下操作:

chmod 700 filename

它起作用了。在Cygwin中,默认情况下您会得到两个组,即Root组和Users组。我想添加另一个组,但是使用我以前在Linux上使用的工具无法做到。因此,我只使用了Users组。


1
它起作用了。但我仍然不明白为什么我必须将文件更改为用户组? - sma
3
在非英语的Windows系统上,您可能需要使用本地语言翻译代替字符串“Users”。例如,在德语的Windows操作系统上,以下命令可以使用:chown :Benutzer 文件名 - malamut
1
+8 太棒了!这个问题已经困扰我好几次了。 - akauppi
解决方案中的组更改对我没有用,只有基于setfacl的解决方案有效! - dim
目前在cygwin中,我可以关闭组权限,但无法重新获取它们。对用户进行chown可以起作用,但当我改回自己的所有权时,之前的权限会恢复。呃。 - juanitogan

4
Cygwin不喜欢文件被它不认识的组所拥有。不幸的是,这在Cygwin中经常发生,特别是如果您的PC在一个Windows域中,那里的东西总是在变化。我还通过外部驱动器在两台PC之间同步我的文件,不同PC之间的uid/gid是不同的,所以这是一个问题的来源。
如果你运行ls -l并看到一个数字组ID而不是组名,这意味着Cygwin不知道gid——即它不在/etc/group中,并且Cygwin也无法从Windows中查询它。您可以通过运行getent group <gid>来确认这一点,其中<gid>是数字组ID。
要修复它,您可以使用chgrp更改所有受影响的文件/目录的组,如上面接受的答案所述,或者在/etc/group中创建一个未知gid的条目,用任何未使用的组名(例如Users2)。
完成后,可能需要关闭所有Cygwin窗口,然后重新打开它们。

我曾经遇到一个情况,/etc/group根本不存在。在这种情况下,创建一个包含johannes:x:1001:johannes的新/etc/group文件并重新启动终端解决了chmod问题。感谢提示。 - Johannes Thoma

2
一项实验表明,在Cygwin下,chmod可以正确地更改组权限。该实验使用了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使用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

The format of symbolic modes is:

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

where PERMS is either zero or more letters from the set 'rwxXst', or a single letter from the set 'ugo'.


抱歉打错了,我本来要输入 "chmod g="。下面是我的情况: $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 - sma

1

像之前的回答一样,未被识别的组会导致这些问题。这通常发生在Windows域中。

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

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

关闭并重新启动Cygwin。


1
虽然这个方法可行,但它会显著降低性能。例如,当执行ls命令时,就好像为每个条目都读取了/etc/passwd文件一样。请注意,我们企业有很多用户和组。 - David
1
请不要这样做:1)它没有起作用;2)它使一切变得更慢,而我不知道如何撤销它。与上面的评论相同。 - Mark

0

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

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

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

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

编辑组文件并添加自定义组名似乎总是很容易解决问题。


0

我在远程从域中使用cygserver时遇到了这个问题。

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

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

我猜cygserver保存了不完整的域组信息。

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


0
#!/bin/bash

find . |while read obj; do
  if [[ -d "$obj" ]]; then
    setfacl --set "user::rwx,group::r-x,other::r-x" "${obj}"
  elif [[ -f "$obj" ]]; then
    setfacl --set "user::rw-,group::r--,other::r--" "${obj}"
  fi
done

-1

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

所以我刚刚做了这个操作: chown -R ONEX:Users ~/*

你可以在这里找到你的用户名和组名:

Image


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接