chmod cygwin ведет себя как рабочий, но на самом деле не работает

chmod cygwin ведет себя как рабочий, но на самом деле не работает

Моя установка 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 ~] >

Обратите внимание, что каталог доступен для записи, так как файл уже создан.

Когда я смотрю на этот каталог сокнаперспектива, сообщается кактолько для чтения(даже после того, как я изменил его на чтение и запись, он снова становится только для чтения).
Скриншоты находятся на/tmp cygwin доступен только для чтения в 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содержимое вставлено ниже


Вероятно, вы используете NTFS или FAT32 в Windows, а эти файловые системы не поддерживаютисполняемыйразрешение. Вместо этого,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

Chmod не работает (без звука) на моем компьютере, если пути в формате Windows. С путями "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--даже после этого.

Поэтому я использовал cmd "function" для преобразования windows-paths в cygdrive-paths:

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 г., NTFS.

Связанный контент