O chmod do cygwin se comporta como se estivesse funcionando, mas não funciona

O chmod do cygwin se comporta como se estivesse funcionando, mas não funciona

Minha instalação do Cygwin está se comportando de maneira estranha: chmodnão 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 ~] >

Observe que o diretório é gravável à medida que o arquivo é criado.

Quando olho para este diretório de umjanelasperspectiva, é relatado comosomente leitura(mesmo depois de alterá-lo para leitura-gravação, ele volta para somente leitura).
As capturas de tela estão em/tmp do cygwin é somente leitura no Windows e não pode ser alterado para leitura-gravação

Você pode sugerir como depurar/resolver?


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

Responder1

Parabéns por esta respostahttps://stackoverflow.com/questions/25730041/updating-file-permissions-with-git-bash-on-windows-7conteúdo colado abaixo


Você provavelmente está usando NTFS ou FAT32 no Windows e esses sistemas de arquivos não suportam oexecutávelpermissão. Em vez de,cygwin analisa o nome e o conteúdo do arquivo para determinar se é executável:

Os arquivos são considerados executáveis ​​se o nome do arquivo terminar com .bat, .com ou .exe, ou se seu conteúdo começar com #!.

Portanto, você deve certificar-se de que o arquivo bash comece com um shebang. Então, você poderá apenas executar o arquivo, desconsiderando a saída de permissão de ls.

Responder2

eu encontreiEsta respostaútil.

Além das permissões POSIX normais que controlam o proprietário, o grupo e outros acessos, a permissão do arquivo no Cygwin também pode ser afetada pela ACL do Windows.

No seu caso, por favor tente

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

Responder3

Não consegui chmod até descobrir que /etc/fstab continha:

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

mas precisava ser:

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

Depois de fechar todos os processos abertos do Cygwin e reiniciar, tudo funcionou.

Responder4

Chmod não funciona (silenciosamente) no meu computador se os caminhos estiverem no formato Windows. Com caminhos "cygdrive" funciona. Aqui está o exemplo:

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

Também há uma estranheza no ls -lcomportamento. O Native Windows caclsconfirma que a segunda chmod 600foi bem-sucedida, mas ls -ldiz -rw-r--r--mesmo depois disso.

Então, usei a "função" cmd para converter caminhos do Windows em caminhos do 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

Minha configuração: Windows 7, cygwin x64 atualizado em setembro de 2020, NTFS.

informação relacionada