cygwin 的 chmod 表现得像工作一样,但它不起作用

cygwin 的 chmod 表现得像工作一样,但它不起作用

我的 Cygwin 安装行为异常:chmod无法工作。

[09:45 Administrator@DellIns14 ~] > ls -ls /usr/bin/chmod
64K -rwxr-xr-x 1 Administrator None 38K Feb  6  2012 /usr/bin/chmod

[09:47 Administrator@DellIns14 ~] > rm /tmp/example.sh
rm: remove regular empty file `/tmp/example.sh'? y
[09:48 Administrator@DellIns14 ~] > touch /tmp/example.sh
[09:48 Administrator@DellIns14 ~] > ls -ls /tmp/example.sh
0 -rw-r--r-- 1 Administrator None 0 Jul  8 09:48 /tmp/example.sh
[09:48 Administrator@DellIns14 ~] > chmod -v +x /tmp/example.sh
mode of `/tmp/example.sh' changed from 0644 (rw-r--r--) to 0755 (rwxr-xr-x)
[09:48 Administrator@DellIns14 ~] > ls -ls /tmp/example.sh
0 -rw-r--r-- 1 Administrator None 0 Jul  8 09:48 /tmp/example.sh
[09:48 Administrator@DellIns14 ~] >

请注意,由于文件已创建,因此目录是可写的。

当我从视窗据报道只读(即使我将其更改为读写,它也会恢复为只读)。
屏幕截图位于cygwin 的 /tmp 在 Windows 中是只读的,无法更改为读写

您能建议如何调试/解决吗?


环境:
Windows 7,Cygwin 1.7.29(0.272/5/3) i686

答案1

感谢这个答案https://stackoverflow.com/questions/25730041/updating-file-permissions-with-git-bash-on-windows-7内容粘贴如下


您可能在 Windows 上使用 NTFS 或 FAT32,这些文件系统不支持可执行文件许可。相反,cygwin 查看文件名和内容来确定它是否可执行

如果文件名以 .bat、.com 或 .exe 结尾,或者其内容以 #! 开头,则文件被视为可执行文件。

因此,您应该确保 bash 文件以 shebang 开头。然后,您应该能够直接执行该文件,而不必考虑 的权限输出ls

答案2

我发现这个答案有帮助的。

除了控制所有者、组、其他访问的正常 POSIX 权限之外,Cygwin 中的文件权限也可能受到 Windows ACL 的影响。

如果你的情况,请尝试

ls -l /tmp/example.sh
getfacl /tmp/example.sh
setfacl -b /tmp/example.sh
ls -l /tmp/example.sh
chmod -v +x /tmp/example.sh
ls -l /tmp/example.sh

答案3

我无法执行 chmod 操作,直到我发现 /etc/fstab 包含:

none /cygdrive cygdrive binary,noacl,posix=0,user 0 0

但需要:

none /cygdrive cygdrive binary,posix=0,user 0 0

关闭所有打开的 Cygwin 进程并重新启动后,一切正常。

答案4

如果路径是 Windows 格式,Chmod 在我的计算机上无法(悄无声息地)工作。使用“cygdrive”路径,它可以工作。以下是示例:

D:\>mkdir D:\test

D:\>touch D:\test\qwe

D:\>ls -l D:\test\qwe
-rw-r--r-- 1 cat None 0 Sep 16 10:40 'D:\test\qwe'

D:\>cacls D:\test\qwe
D:\test\qwe Все:(ID)F

D:\>chmod 600 D:\test\qwe

D:\>ls -l D:\test\qwe
-rw-r--r-- 1 cat None 0 Sep 16 10:40 'D:\test\qwe'

D:\>cacls D:\test\qwe
D:\test\qwe Все:(ID)F

D:\>chmod 600 /cygdrive/D/test/qwe

D:\>ls -l D:\test\qwe
-rw-r--r-- 1 cat None 0 Sep 16 10:40 'D:\test\qwe'

D:\>cacls D:\test\qwe
D:\test\qwe CAT\cat:(специальный доступ:)
                STANDARD_RIGHTS_ALL
                DELETE
                READ_CONTROL
                WRITE_DAC
                WRITE_OWNER
                SYNCHRONIZE
                STANDARD_RIGHTS_REQUIRED
                FILE_GENERIC_READ
                FILE_GENERIC_WRITE
                FILE_READ_DATA
                FILE_WRITE_DATA
                FILE_APPEND_DATA
                FILE_READ_EA
                FILE_WRITE_EA
                FILE_READ_ATTRIBUTES
                FILE_WRITE_ATTRIBUTES

        CAT\None:(специальный доступ:)
                 READ_CONTROL
                 SYNCHRONIZE
                 FILE_READ_ATTRIBUTES

        Все:(специальный доступ:)
            READ_CONTROL
            SYNCHRONIZE
            FILE_READ_ATTRIBUTES

行为上也有些奇怪ls -l。本机 Windowscacls确认第二个chmod 600操作成功,但之后仍然如此ls -l-rw-r--r--

因此我使用 cmd“功能”将 windows 路径转换为 ​​cygdrive 路径:

call :chmod "D:\test\qwe"
rem ...
goto :eof

:chmod
set "STMP=%~dp1"
set "STMP=%STMP:\=/%"
set "STMP=%STMP::=%"
set "STMP=/cygdrive/%STMP%%~nx1"
chmod 600 "%STMP%"
set "STMP="
goto :eof

我的配置:Windows 7、cygwin x64(2020 年 9 月更新)、NTFS。

相关内容