我正在使用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
组。
ls -l
并看到一个数字组ID而不是组名,这意味着Cygwin不知道gid——即它不在/etc/group
中,并且Cygwin也无法从Windows中查询它。您可以通过运行getent group <gid>
来确认这一点,其中<gid>
是数字组ID。chgrp
更改所有受影响的文件/目录的组,如上面接受的答案所述,或者在/etc/group
中创建一个未知gid的条目,用任何未使用的组名(例如Users2
)。chmod
可以正确地更改组权限。该实验使用了NTFS分区上的一个文件。Cygwin在Windows上实现了一个POSIX层,但它仍然最终使用Windows本身和特定文件系统实现的功能。chmod
。但是,外部USB驱动器通常使用FAT32,它没有相同的权限表示能力。Cygwin层尽可能地伪造POSIX语义,但它所能做的有限。$ df -T .
id_dsa
的文件可能是SSH私钥,它需要存储在$HOME/.ssh
中。这个答案的其余部分是针对问题原始版本的,该版本在chmod
命令中有一个拼写错误。
Cygwin使用GNU Coreutils版本的chmod
。这个,
chmod g=0 fileName
不是正确的语法。我得到了:
$ chmod g=0 fileName
chmod: invalid mode: `g=0'
Try `chmod --help' for more information.
$ 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'.
像之前的回答一样,未被识别的组会导致这些问题。这通常发生在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 SIDs到POSIX uid / gid值的规则:0x100000偏移量用于来自计算机主域的帐户。 尝试从1049120中删除相同的偏移量,您将获得544,这是内置管理员组的RID。
该帐户不是本地管理员组的成员;我们使用SuRun授予管理员权限而不泄露凭据。在这种情况下,mkgroup无法生成所有可能的gid。
编辑组文件并添加自定义组名似乎总是很容易解决问题。
我在远程从域中使用cygserver时遇到了这个问题。
运行ls -l
显示数字组ID而不是组名。
我停止了cygserver,net stop "CYGWIN cygserver"
和其他Cygwin进程,然后再次运行ls -l
,然后组名就正确显示了。
我猜cygserver保存了不完整的域组信息。
重新启动cygserver后,系统继续正常工作。
#!/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
你必须在 Windows 系统上指定你的用户所属的组名。
所以我刚刚做了这个操作:
chown -R ONEX:Users ~/*
你可以在这里找到你的用户名和组名: