Cygwin bash sed blokuje moje pliki

12

Kiedy zmieniam pliki w cygwin bash za pomocą polecenia sed, plik zostaje zablokowany.

Rozmnażać się:

  1. Otwarty cmdi cddo katalogu non-user (fe temp)
  2. echo aaa > test.txt
  3. Otwórz w edytorze tekstu, dodaj linię, spróbuj zapisać => działa
  4. %CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt
  5. W edytorze tekstu dodaj kolejny wiersz i spróbuj zapisać => „Odmowa dostępu”

WTF ?! Jak mogę uspokoić plik bez blokowania lub zwolnić uchwyty pliku?

  • Wygląda na to, że uprawnienia zabezpieczeń systemu Windows są całkowicie przykręcone do pliku:

    Uprawnienia przed:

    uprawnienia wcześniej (Obraz!)

    Uprawnienia po:

    uprawnienia po (Obraz!)

  • Działa jednak w katalogu użytkownika ( Desktop)

  • Sprawdziłem plik za pomocą LockHunter, ale nie pojawił się żaden proces, aby zablokować plik
  • Cygwin FAQ wspomina o zakłóceniach w niektórych programach. Próbował odinstalować Antivir i Catalyst i zrestartować komputer.
  • Próbowanie UnxTools (awarie), GnuWin32 (sed nie obsługuje zastępowania w miejscu), Interex (instalator nie obsługuje W7 Pro) ... * westchnienie *
Kaczor Donald
źródło
2
To po prostu brzmi jak podejrzana filozofia systemu Windows „musi chronić użytkowników przed sobą”, widzę to cały czas, gdy próbuję łączyć i dopasowywać pliki Windows i Cygwin / Linux. Powodzenia.
shellter
+1 lambdor. Sprawdziłem to zachowanie w Cygwin i masz rację. To jest dość dziwne. Plik nie jest zablokowany (tzn. Ponieważ nie jest używany). Uprawnienia do pliku tylko do odczytu / uprawnienia do zapisu do odczytu zostaną zmodyfikowane.
Użyłem GnuWin32 sed na W7 64bit i nie miałem problemu z zastąpieniem w miejscu. Jest to wersja 4.2.1, którą pobrałem z projektem getGnuWin32 .
Spencer Rathbun

Odpowiedzi:

8

odpowiadający Cygwin Mailinglist , użyj noacl do montowania

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

lub bezpośrednio w systemie Windows ../cygwin/fstabprzed uruchomieniem bash Cygwin

C:/tmp /mnt/tmp ntfs binary,posix=0,user,noacl 0 0
Kamil Maciorowski
źródło
5

Miałem dokładnie taki sam problem po użyciu polecenia find w połączeniu z grep i sed pod cygwin do automatycznego przetwarzania folderu pełnego plików kodu źródłowego Java. Sed pomieszał uprawnienia do plików NTFS moich plików, które nadal były trwałe po ponownym uruchomieniu, więc szukałem łatwego sposobu, aby to naprawić.

Znalazłem prosty sposób na przywrócenie uprawnień do plików do starych wartości. Można to zrobić rekurencyjnie dla całego folderu, co jest dla mnie ważne, ponieważ zmodyfikowałem tak wiele plików jednocześnie (kilkaset). Niestety, znam tylko niemieckie nazwy pozycji menu, więc nie jestem pewien, jak pozycje menu (w Eksploratorze Windows) są wywoływane we właściwym języku angielskim.

W języku niemieckim robisz: Kliknij prawym przyciskiem myszy folder nadrzędny folderu, w którym użyłem sed, „Eigenschaften” (menu kontekstowe), „Sicherheit” (karta w oknie dialogowym), „Erweitert” (przycisk), „Berechtigungen ändern ... „(przycisk z pytaniem UAC), teraz po prostu zaznaczam oba pola wyboru (górne jest już ustawione, ale dolne nie, ale musi być). Teraz trzy razy klikam „OK”.

Rzeczywista zmiana, która jest przez to wykonana, polega na tym, że dolne pole wyboru zmusza system Windows do zastąpienia bieżących uprawnień dla zawartości folderu rekurencyjnie uprawnieniami do folderu, który kliknąłeś prawym przyciskiem myszy, więc wszystkie złamane uprawnienia są naprawione. Dla mnie działało to jak urok, a także jest bardzo szybkie (tylko kilka sekund dla wielu plików).

Możliwe tłumaczenia (zgadnięte przeze mnie):

  • „Eigenschaften” -> „Właściwości”
  • „Sicherheit” -> „Bezpieczeństwo”
  • „Erweitert” -> „Zaawansowane”
  • „Berechtigungen ändern ...” -> „Zmień uprawnienia ...”
Rolf Viehmann
źródło
2

Uruchomiłem własny zestaw testów i rzeczywiście uprawnienia pliku ustawiają się na r-xr-x --- po poleceniu sed i kolejnych poleceniach cygwin będzie to traktować jako plik tylko do odczytu.

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>

Te uprawnienia -r-xr-x --- zapobiegają kolejnym zapisom niektórych programów:

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

Zatem obejściem byłoby dodanie do pliku dodatkowego chmod

C:\temp>chmod 777 test.txt
C:\temp>echo xxx > test.txt
C:\temp>
Stephen Quan
źródło
dziwne jest to, że pierwsza maska ​​uprawnień „---------- + 1 bikeguy ????????” na które też wpadam przy użyciu Cygwin / Windows. Następnie piszesz „Te -r-xr-x --- uprawnienia zapobiegają kolejnym zapisom przez niektóre oprogramowanie:„ Może więc „niektóre oprogramowanie” działa w innej grupie ORAZ ponieważ nie ma dostępu przez „inne” uprawnienia, co powoduje problem? Dzięki, to debugowanie pomogło mi z tym problemem. Powodzenia wszystkim.
shellter
Tak, @shellter Zauważyłem to także, kiedy szukałem odpowiedzi. Zakładam, że wiersz „----------- +” oznaczający brak bezpieczeństwa (więc masz pełny dostęp), podczas gdy „-r-xr-x --- +” oznacza, że ​​bezpieczeństwo istnieje tam, gdzie jest dostęp do zapisu brakujący. Jeśli zrobię chmod 000, dostanę również „---------- +”, ale tym razem jest to zdecydowanie bezpieczeństwo i nie mam uprawnień do odczytu lub zapisu tego pliku.
Używam git w wersji 1.9.5.msysgit.1, widzę również ten sam problem, używam chmod 777 test.txtpolecenia, aby obejść ten problem.
ollydbg23