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 ~] >

請注意,在建立檔案時,該目錄是可寫入的。

當我從 a 查看這個目錄時視窗角度來看,據報道只讀(即使我將其更改為讀寫後,它也會恢復為唯讀)。
螢幕截圖位於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。 Native Windowscacls確認第二次chmod 600成功,但即使在那之後也是ls -l如此-rw-r--r--

所以我使用 cmd“function”將 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,2020 年 9 月更新的 cygwin x64,NTFS。

相關內容