Meine Cygwin-Installation verhält sich seltsam: chmod
funktioniert nicht.
[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 ~] >
Beachten Sie, dass das Verzeichnis beschreibbar ist, sobald die Datei erstellt wurde.
Wenn ich mir dieses Verzeichnis von einemFensterPerspektive wird berichtet,schreibgeschützt(selbst nachdem ich es auf Lesen/Schreiben umgestellt habe, wird es wieder auf schreibgeschützt zurückgesetzt).
Bildschirmaufnahmen sind beiCygwins /tmp ist in Windows schreibgeschützt und kann nicht in Lese-/Schreibzugriff geändert werden.
Können Sie Vorschläge zur Fehlerbehebung/Lösung machen?
Umgebung:
Windows 7, Cygwin 1.7.29(0.272/5/3) i686
Antwort1
Ein großes Lob für diese Antworthttps://stackoverflow.com/questions/25730041/updating-file-permissions-with-git-bash-on-windows-7Inhalt unten eingefügt
Sie verwenden wahrscheinlich NTFS oder FAT32 unter Windows und diese Dateisysteme unterstützen nicht dieausführbarErlaubnis. Stattdessencygwin prüft den Dateinamen und den Inhalt, um festzustellen, ob die Datei ausführbar ist:
Dateien gelten als ausführbar, wenn ihr Dateiname mit .bat, .com oder .exe endet oder ihr Inhalt mit #! beginnt.
Stellen Sie daher sicher, dass die Bash-Datei mit einem Shebang beginnt. Anschließend sollten Sie die Datei ausführen können, ohne die Berechtigungsausgabe von zu beachten ls
.
Antwort2
ich fandDiese Antworthilfreich.
Neben normalen POSIX-Berechtigungen, die Besitzer, Gruppen und andere Zugriffe steuern, können die Dateiberechtigungen in Cygwin auch durch die Windows-ACL beeinflusst werden.
Versuchen Sie in Ihrem Fall bitte
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
Antwort3
Ich konnte keinen Chmod-Befehl ausführen, bis ich feststellte, dass /etc/fstab Folgendes enthielt:
none /cygdrive cygdrive binary,noacl,posix=0,user 0 0
aber musste sein:
none /cygdrive cygdrive binary,posix=0,user 0 0
Nach dem Schließen aller offenen Cygwin-Prozesse und einem Neustart funktionierte alles.
Antwort4
Chmod funktioniert auf meinem Computer nicht (im Hintergrund), wenn die Pfade im Windows-Format vorliegen. Mit "cygdrive"-Pfaden funktioniert es. Hier ist das Beispiel:
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
Außerdem gibt es eine Merkwürdigkeit im ls -l
Verhalten. Das native Windows cacls
bestätigt, dass der zweite chmod 600
erfolgreich war, ls -l
sagt aber -rw-r--r--
auch danach noch etwas.
Daher habe ich die cmd-„Funktion“ verwendet, um Windows-Pfade in Cygdrive-Pfade umzuwandeln:
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
Meine Konfiguration: Windows 7, Cygwin x64, aktualisiert im September 2020, NTFS.