Cygwin bash sed sperrt meine Dateien

12

Wenn ich Dateien in Cygwin Bash mit dem Befehl sed ändere, wird die Datei gesperrt.

Reproduzieren:

  1. Öffnen cmdund cdzu nicht-Benutzerverzeichnis (fe temp)
  2. echo aaa > test.txt
  3. Öffne im Texteditor, füge eine Zeile hinzu, versuche zu speichern => funktioniert
  4. %CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt"
  5. Fügen Sie im Texteditor eine weitere Zeile hinzu und versuchen Sie zu speichern => "Zugriff verweigert"

WTF ?! Wie kann ich eine Datei ohne Sperren sedieren oder die Dateizugriffsnummern danach freigeben?

  • Windows-Sicherheitsberechtigungen scheinen vollständig in die Datei eingebunden zu sein:

    Berechtigungen vor:

    Berechtigungen vor (Bild!)

    Berechtigungen nach:

    Berechtigungen nach (Bild!)

  • Es funktioniert jedoch im Benutzerverzeichnis ( Desktop)

  • Ich habe die Datei mit LockHunter überprüft, aber es wird kein Prozess zum Sperren der Datei angezeigt
  • In den häufig gestellten Fragen zu Cygwin werden Störungen bei einigen Programmen erwähnt. Es wurde versucht, Antivir und Catalyst zu deinstallieren und neu zu starten.
  • Versuche UnxTools (Abstürze), GnuWin32 (sed unterstützt keine Inplace-Substitution), Interex (Installer unterstützt W7 Pro nicht) ... * seufz *
Donald Duck
quelle
2
Das hört sich einfach so an, als müsse die bescheuerte Windows-Philosophie "Benutzer vor sich selbst schützen". Ich sehe das die ganze Zeit, wenn ich versuche, Windows- und Cygwin / Linux-Dateien zu mischen und abzugleichen. Viel Glück.
Shellter
+1 Lambdor. Ich habe dieses Verhalten in Cygwin überprüft und Sie haben Recht. Das ist ziemlich komisch. Die Datei ist nicht gesperrt (dh sie wird nicht verwendet). Die Dateiberechtigungen schreibgeschützt / schreibgeschützt werden geändert.
Ich habe GnuWin32 sed auf W7 64bit verwendet und hatte keine Probleme mit der Platzersetzung. Es ist sed 4.2.1, das ich mit dem getGnuWin32-Projekt heruntergeladen habe .
Spencer Rathbun

Antworten:

8

entsprechend Cygwin Mailinglist verwenden Sie noacl zum Mounten

$ mount -o binary,posix=0,user,noacl C:/tmp /mnt/tmp

oder direkt in Windows, ../cygwin/fstabbevor Sie Cygwin bash starten

C:/tmp /mnt/tmp ntfs binary,posix=0,user,noacl 0 0
Kamil Maciorowski
quelle
5

Ich hatte genau die gleichen Probleme, nachdem ich find in Kombination mit grep und sed unter cygwin verwendet hatte, um einen Ordner voll mit Java-Quellcodedateien automatisch zu verarbeiten. Sed hat die NTFS-Dateiberechtigungen meiner Dateien, die nach einem Neustart noch vorhanden waren, durcheinander gebracht, und ich habe nach einer einfachen Möglichkeit gesucht, dies zu beheben.

Ich habe tatsächlich eine einfache Möglichkeit gefunden, die Dateiberechtigungen auf die alten Werte zurückzusetzen. Es kann für einen ganzen Ordner rekursiv durchgeführt werden, was für mich wichtig ist, da ich so viele Dateien auf einmal geändert habe (mehrere hundert). Leider kenne ich nur die deutschen Namen für die Menüeinträge, daher bin ich mir nicht sicher, wie die Menüeinträge (im Windows Explorer) in korrektem Englisch heißen.

In deutscher Sprache machen Sie Folgendes: Klicken Sie mit der rechten Maustaste auf den übergeordneten Ordner des Ordners, in dem ich sed verwendet habe, auf "Eigenschaften" (Kontextmenü), "Sicherheit" (Registerkarte im Dialogfeld), "Erweitert" (Schaltfläche), "Berechtigungen ändern ...". "(Schaltfläche mit UAC - Eingabeaufforderung), jetzt überprüfe ich nur beide Kontrollkästchen (das obere ist bereits gesetzt, das untere ist nicht gesetzt, muss es aber sein). Nun klicke ich dreimal auf "OK".

Die tatsächliche Änderung, die hierdurch vorgenommen wird, besteht darin, dass das untere Kontrollkästchen Windows zwingt, die aktuellen Berechtigungen für den Ordnerinhalt rekursiv durch die Berechtigungen des Ordners zu ersetzen, auf den Sie mit der rechten Maustaste geklickt haben, sodass alle fehlerhaften Berechtigungen behoben werden. Arbeitete wie ein Zauber für mich und ist auch sehr schnell (nur ein paar Sekunden für viele Dateien).

Mögliche Übersetzungen (von mir erraten):

  • "Eigenschaften" -> "Properties"
  • "Sicherheit" -> "Security"
  • "Erweitert" -> "Advanced"
  • "Berechtigungen ändern ..." -> "Berechtigungen ändern ..."
Rolf Viehmann
quelle
2

Ich habe meine eigenen Tests durchgeführt, und in der Tat werden die Berechtigungen der Datei auf r-xr-x gesetzt - nachdem der sed-Befehl und nachfolgende cygwin-Befehle dies als schreibgeschützte Datei wahrgenommen haben.

C:\Temp>echo aaa > test.txt
C:\Temp>ls -l
total 1
----------+ 1 bikeguy ???????? 6 Feb 21 08:51 test.txt
C:\temp>sed -i 's/aaa/bbb/' test.txt
C:\temp>cat test.txt
bbb
C:\temp>ls -l test.txt
-r-xr-x---+ 1 bikeguy mkgroup-l-d 5 Feb 21 08:52 test.txt
C:\temp>

Diese -r-xr-x --- -Berechtigungen verhindern nachfolgende Schreibvorgänge durch einige Software:

C:\temp>echo xxx > test.txt
Access is denied.
C:\temp>

Die Problemumgehung wäre also, der Datei ein zusätzliches chmod hinzuzufügen

C:\temp>chmod 777 test.txt
C:\temp>echo xxx > test.txt
C:\temp>
Stephen Quan
quelle
das seltsame ist die erste erlaubnismaske '---------- + 1 bikeguy ????????' auf die ich auch mit Cygwin / Windows stoße. Dann schreiben Sie: 'Diese -r-xr-x --- -Berechtigungen verhindern nachfolgende Schreibvorgänge durch eine Software:' Vielleicht wird die 'einige Software' unter einer anderen Gruppe ausgeführt, UND weil es keinen Zugriff durch 'andere' Berechtigungen gibt, der dies verursacht das Problem? Danke, dieses Debugging hat mir bei diesem Problem geholfen. Viel Glück für jeden.
Shellter
Ja, @Shellter, ich habe das auch bemerkt, als ich nach der Antwort gesucht habe. Ich habe angenommen, dass die Zeile "----------- +" bedeutet, dass keine Sicherheit vorhanden ist (Sie haben also vollen Zugriff), während "-r-xr-x --- +" bedeutet, dass Sicherheit vorhanden ist, wenn Schreibzugriff besteht fehlt. Wenn ich ein chmod 000 gemacht habe, bekomme ich auch '---------- +', aber diesmal gibt es definitiv Sicherheit und ich habe keine Rechte, diese Datei zu lesen oder zu schreiben.
Ich verwende die Git-Version 1.9.5.msysgit.1. Ich sehe auch dasselbe Problem. Ich verwende den chmod 777 test.txtBefehl, um dieses Problem zu umgehen.
ollydbg23