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