Cygwin bash sed blocca i miei file


12

Quando cambio file in cygwin bash con il comando sed, il file viene bloccato.

Riprodurre:

  1. Apri cmde cdnella directory non utente (fe temp)
  2. echo aaa > test.txt
  3. Apri in texteditor, aggiungi riga, prova a salvare => funziona
  4. %CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt"
  5. In texteditor, aggiungi un'altra riga e prova a salvare => "Accesso negato"

WTF ?! Come posso sed un file senza bloccare o rilasciare successivamente gli handle di file?

  • Le autorizzazioni di sicurezza di Windows sembrano essere completamente avvitate sul file:

    Autorizzazioni prima di:

    permessi prima (Immagine!)

    Autorizzazioni dopo:

    permessi dopo (Immagine!)

  • Funziona comunque nella directory utente ( Desktop)

  • Ho controllato il file con LockHunter ma non appare alcun processo per bloccare il file
  • Le FAQ di Cygwin menzionano interferenze con alcuni programmi. Ha provato a disinstallare Antivir e Catalyst e riavviare.
  • Provando UnxTools (arresti anomali), GnuWin32 (sed non supporta la sostituzione sul posto), Interex (il programma di installazione non supporta W7 Pro) ... * sigh *

2
Sembra proprio che la fottuta filosofia di Windows "debba proteggere gli utenti da se stessi", lo vedo sempre quando provo a mescolare e abbinare i file Windows e Cygwin / Linux. In bocca al lupo.
shellter

+1 lambdor. Ho verificato questo comportamento in Cygwin e hai ragione. Questo è piuttosto strano. Il file non è bloccato (ovvero perché non è in uso). Le autorizzazioni per i file di sola lettura / lettura vengono modificate.

Ho usato GnuWin32 sed su W7 64 bit e non ho avuto problemi con la sostituzione. È sed 4.2.1 che ho scaricato con il progetto getGnuWin32 .
Spencer Rathbun,

Risposte:


8

corrispondente a Cygwin Mailinglist , utilizzare noacl per il montaggio

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

o direttamente in Windows ../cygwin/fstabprima di avviare Cygwin bash

C:/tmp /mnt/tmp ntfs binary,posix=0,user,noacl 0 0

5

Ho avuto esattamente lo stesso problema dopo aver usato find in combinazione con grep e sed sotto cygwin per elaborare automaticamente una cartella piena di file di codice sorgente Java. Sed ha incasinato le autorizzazioni dei file NTFS dei miei file, che erano ancora persistenti dopo un riavvio, quindi ho cercato un modo semplice per risolvere questo problema.

In realtà ho trovato un modo semplice per riportare i permessi dei file ai vecchi valori. Può essere fatto in modo ricorsivo per un'intera cartella, il che è importante per me, poiché ho modificato così tanti file contemporaneamente (diverse centinaia). Purtroppo, conosco solo i nomi tedeschi per le voci di menu, quindi non sono sicuro di come le voci di menu (in Esplora risorse) siano chiamate in inglese corretto.

In tedesco, fai: Fai clic destro sulla cartella principale della cartella in cui ho usato sed, "Eigenschaften" (menu di scelta rapida), "Sicherheit" (scheda nella finestra di dialogo), "Erweitert" (pulsante), "Berechtigungen ändern ... "(pulsante con prompt UAC), ora seleziono entrambe le caselle di controllo (quella superiore è già impostata, ma quella inferiore non lo è, ma deve esserlo). Ora clicco su "OK" per tre volte.

La vera modifica apportata da ciò è che la casella di controllo inferiore forza Windows a sostituire ricorsivamente le autorizzazioni correnti per il contenuto della cartella con le autorizzazioni della cartella che hai fatto clic con il pulsante destro del mouse, quindi tutte le autorizzazioni interrotte vengono riparate. Ha funzionato come un incantesimo per me ed è anche molto veloce (solo pochi secondi per molti file).

Traduzioni possibili (indovinate da me):

  • "Eigenschaften" -> "Proprietà"
  • "Sicherheit" -> "Sicurezza"
  • "Erweitert" -> "Avanzate"
  • "Berechtigungen ändern ..." -> "Cambia permessi ..."

2

Ho eseguito il mio set di test e, in effetti, le autorizzazioni del file vengono impostate su r-xr-x --- dopo che il comando sed e i successivi comandi cygwin lo percepiranno come un file di sola lettura.

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>

Queste autorizzazioni -r-xr-x --- impediscono scritture successive da parte di alcuni software:

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

Quindi, la soluzione alternativa sarebbe quella di aggiungere un chmod aggiuntivo al file

C:\temp>chmod 777 test.txt
C:\temp>echo xxx > test.txt
C:\temp>

la cosa strana è la prima maschera dei permessi '---------- + 1 bikeguy ????????' che incontro anche usando Cygwin / Windows. Quindi scrivi "Queste autorizzazioni -r-xr-x --- impediscono successive scritture da parte di alcuni software:" Quindi forse "alcuni software" viene eseguito in un gruppo diverso E perché non vi è accesso attraverso le autorizzazioni "altro", che causa il problema? Grazie, questo debug mi ha aiutato con questo problema. Buona fortuna a tutti.
shellter

Sì, @shellter l'ho notato anche quando stavo cercando la risposta. Ho ipotizzato che la riga '----------- +' significasse che non esiste alcuna sicurezza (quindi hai pieno accesso) mentre '-r-xr-x --- +' significa che esiste sicurezza dove l'accesso in scrittura è mancante. Se avessi fatto un chmod 000 avrei anche '---------- +' ma questa volta c'è sicuramente sicurezza e non ho i privilegi per leggere o scrivere questo file.

Sto usando git versione 1.9.5.msysgit.1, vedo anche lo stesso problema, utilizzo il chmod 777 test.txtcomando per risolvere il problema.
ollydbg23
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.