Cygwin bash sed verrouille mes fichiers

12

Lorsque je change des fichiers dans cygwin bash avec la commande sed, le fichier est verrouillé.

Reproduire:

  1. Ouvrir cmdet cddans un répertoire non utilisateur (fe temp)
  2. echo aaa > test.txt
  3. Ouvrez dans texteditor, ajoutez une ligne, essayez d'enregistrer => travaux
  4. %CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt"
  5. Dans texteditor, ajoutez une autre ligne et essayez d'enregistrer => "Accès refusé"

WTF?! Comment puis-je sed un fichier sans verrouillage, ou libérer les poignées de fichier par la suite?

  • Les autorisations de sécurité Windows semblent être complètement vissées sur le fichier:

    Autorisations avant:

    autorisations avant (Image!)

    Autorisations après:

    autorisations après (Image!)

  • Cela fonctionne cependant dans le répertoire utilisateur ( Desktop)

  • J'ai vérifié le fichier avec LockHunter mais aucun processus ne semble verrouiller le fichier
  • La FAQ Cygwin mentionne les interférences avec certains programmes. Il a essayé de désinstaller Antivir et Catalyst et de redémarrer.
  • Essayer UnxTools (plante), GnuWin32 (sed ne prend pas en charge la substitution sur place), Interex (l'installateur ne prend pas en charge W7 Pro) ... * soupir *
Donald Duck
la source
2
Cela ressemble juste à la philosophie visqueuse de Windows «doit protéger les utilisateurs contre eux-mêmes», je vois cela tout le temps lorsque vous essayez de mélanger et de faire correspondre des fichiers Windows et Cygwin / Linux. Bonne chance.
shellter
+1 lambdor. J'ai vérifié ce comportement dans Cygwin et vous avez raison. C'est assez bizarre. Le fichier n'est pas verrouillé (c'est-à-dire qu'il n'est pas utilisé). Les autorisations de fichier en lecture seule / en lecture / écriture sont modifiées.
J'ai utilisé GnuWin32 sed sur W7 64 bits et je n'ai eu aucun problème avec la substitution en place. C'est sed 4.2.1 que j'ai téléchargé avec le projet getGnuWin32 .
Spencer Rathbun

Réponses:

8

correspondant à Cygwin Mailinglist , utilisez noacl pour le montage

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

ou directement dans Windows ../cygwin/fstabavant de démarrer Cygwin bash

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

J'ai eu exactement le même problème après avoir utilisé find en combinaison avec grep et sed sous cygwin pour traiter automatiquement un dossier plein de fichiers de code source Java. Sed a gâché les autorisations de fichiers NTFS de mes fichiers, qui étaient toujours persistantes après un redémarrage, j'ai donc cherché un moyen facile de résoudre ce problème.

En fait, j'ai trouvé un moyen facile de récupérer les autorisations de fichier sur les anciennes valeurs. Cela peut être fait pour un dossier entier récursivement, ce qui est important pour moi, car j'ai modifié tant de fichiers à la fois (plusieurs centaines). Malheureusement, je ne connais que les noms allemands des entrées de menu, donc je ne sais pas comment les entrées de menu (dans l'Explorateur Windows) sont appelées en anglais correct.

En allemand, vous faites: Faites un clic droit sur le dossier parent du dossier où j'ai utilisé sed, "Eigenschaften" (menu contextuel), "Sicherheit" (onglet dans la boîte de dialogue), "Erweitert" (bouton), "Berechtigungen ändern ... "(bouton avec invite UAC), maintenant je vérifie simplement les deux cases à cocher (celle du haut est déjà définie, mais celle du bas ne l'est pas, mais doit l'être). Maintenant, je clique sur "OK" trois fois.

La modification réelle qui en résulte est que la case à cocher inférieure oblige Windows à remplacer les autorisations actuelles pour le contenu du dossier de manière récursive par les autorisations du dossier que vous avez cliqué avec le bouton droit, afin que toutes les autorisations rompues soient corrigées. A fonctionné comme un charme pour moi, et est également très rapide (seulement quelques secondes pour beaucoup de fichiers).

Traductions possibles (devinées par moi):

  • "Eigenschaften" -> "Propriétés"
  • "Sicherheit" -> "Sécurité"
  • "Erweitert" -> "Avancé"
  • "Berechtigungen ändern ..." -> "Modifier les autorisations ..."
Rolf Viehmann
la source
2

J'ai exécuté mon propre ensemble de tests et, en effet, les autorisations du fichier sont définies sur r-xr-x --- après que la commande sed et les commandes cygwin suivantes le percevront comme un fichier en lecture seule.

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>

Ces autorisations -r-xr-x --- empêchent les écritures ultérieures par certains logiciels:

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

Donc, la solution de contournement serait d'ajouter un chmod supplémentaire sur le fichier

C:\temp>chmod 777 test.txt
C:\temp>echo xxx > test.txt
C:\temp>
Stephen Quan
la source
la chose étrange est le premier masque d'autorisations '---------- + 1 bikeguy ????????' que je rencontre également avec Cygwin / Windows. Ensuite, vous écrivez «Ces autorisations -r-xr-x --- empêchent les écritures ultérieures par certains logiciels: le problème? Merci, ce débogage m'a aidé à résoudre ce problème. Bonne chance à tous.
shellter
Ouais, @shellter, je l'ai remarqué aussi quand je cherchais la réponse. J'ai supposé que la ligne '----------- +' signifiait qu'il n'y avait pas de sécurité (donc vous avez un accès complet) tandis que '-r-xr-x --- +' signifie que la sécurité existe là où l'accès en écriture est disparu. Si j'ai fait un chmod 000, j'obtiendrai également '---------- +' mais cette fois il y a définitivement de la sécurité et je n'ai aucun privilège pour lire ou écrire ce fichier.
J'utilise la version 1.9.5.msysgit.1 de git, je vois également le même problème, j'utilise la chmod 777 test.txtcommande pour contourner ce problème.
ollydbg23