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

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

Когда я смотрю на этот каталог с точки зрения Windows, он отображается как доступный только для чтения (даже после того, как я изменил его на чтение-запись, он снова становится доступным только для чтения).
Снимки экрана находятся в Cygwin's / TMP только для чтения в Windows, и не может быть изменен на чтение-запись

Можете ли вы предложить, как отладить / решить?


Среда:
Windows 7, Cygwin 1.7.29 (0.272 / 5/3) i686

5 ответов

Престижность этого ответа https://stackoverflow.com/questions/25730041/updating-file-permissions-with-git-bash-on-windows-7 содержание, вставленное ниже


Вы, вероятно, используете NTFS или FAT32 в Windows, и эти файловые системы не поддерживают разрешение на выполнение. Вместо этого cygwin просматривает имя файла и его содержимое, чтобы определить, является ли он исполняемым:

Файлы считаются исполняемыми, если имя файла заканчивается на.bat,.com или.exe или если его содержимое начинается с #!.

Поэтому вы должны убедиться, что файл bash начинается с шебанга. Затем вы сможете просто выполнить файл, не обращая внимания на вывод разрешения ls,

Просто добавь#!/bin/bashв первой строке скрипта,

но важно сделать это с помощью nano или vi .

После сохранения файл будет отображаться зеленым цветом с разрешением на выполнение.

см. изображение, например:

Я не мог выполнить chmod, пока не обнаружил, что /etc/fstab содержал:

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

но нужно было:

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

После закрытия всех открытых процессов Cygwin и перезапуска все заработало.

Я нашел этот ответ полезным.

Помимо обычных разрешений 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

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" для преобразования оконных путей в 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 года, NTFS.

Другие вопросы по тегам