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

/etc/fstab에 다음이 포함되어 있다는 것을 발견할 때까지 chmod를 수행할 수 없었습니다.

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또한 행동 에도 이상한 점이 있습니다 . 기본 Windows는 cacls두 번째가 성공했음을 확인 chmod 600하지만 그 이후에도 ls -l말합니다 .-rw-r--r--

그래서 Windows 경로를 cygdrive 경로로 변환하기 위해 cmd "function"을 사용했습니다.

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.

관련 정보