El chmod de Cygwin se comporta como si funcionara, pero no funciona.

El chmod de Cygwin se comporta como si funcionara, pero no funciona.

Mi instalación de Cygwin se comporta de forma extraña: chmodno funciona.

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

Tenga en cuenta que se puede escribir en el directorio a medida que se crea el archivo.

Cuando miro este directorio desde unventanasperspectiva, se reporta comosolo lectura(incluso después de cambiarlo a lectura-escritura, vuelve a solo lectura).
Las capturas de pantalla están en/tmp de cygwin es de solo lectura en Windows y no se puede cambiar a lectura-escritura

¿Puede sugerir cómo depurar/resolver?


Entorno:
Windows 7, Cygwin 1.7.29(0.272/5/3) i686

Respuesta1

Felicitaciones a esta respuestahttps://stackoverflow.com/questions/25730041/updating-file-permissions-with-git-bash-on-windows-7contenido pegado a continuación


Probablemente esté utilizando NTFS o FAT32 en Windows y esos sistemas de archivos no son compatibles con elejecutablepermiso. En cambio,cygwin mira el nombre del archivo y su contenido para determinar si es ejecutable:

Los archivos se consideran ejecutables si el nombre del archivo termina en .bat, .com o .exe, o si su contenido comienza con #!.

Por lo tanto, debes asegurarte de que el archivo bash comience con un shebang. Luego, debería poder simplemente ejecutar el archivo, sin tener en cuenta el permiso de salida de ls.

Respuesta2

encontréEsta respuestaútil.

Además de los permisos POSIX normales que controlan el propietario, el grupo y otros accesos, el permiso de archivo en Cygwin también puede verse afectado por la ACL de Windows.

En tu caso, intenta

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

Respuesta3

No pude hacer chmod hasta que descubrí que /etc/fstab contenía:

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

pero necesitaba ser:

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

Después de cerrar todos los procesos abiertos de Cygwin y reiniciar, todo funcionó.

Respuesta4

Chmod no funciona (silenciosamente) en mi computadora si las rutas están en formato Windows. Con rutas "cygdrive" funciona. Aquí está el ejemplo:

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

También hay una rareza en el ls -lcomportamiento. Windows nativo caclsconfirma que el segundo chmod 600fue exitoso, pero ls -ldice -rw-r--r--incluso después.

Así que he usado la "función" cmd para convertir rutas de Windows en rutas de 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

Mi configuración: Windows 7, cygwin x64 actualizado en septiembre de 2020, NTFS.

información relacionada