Cygwin bash sed bloquea mis archivos

12

Cuando cambio archivos en cygwin bash con el comando sed, el archivo se bloquea.

Reproducir:

  1. Abierto cmdy cdal directorio de no usuarios (fe temp)
  2. echo aaa > test.txt
  3. Abrir en el editor de texto, agregar línea, intentar guardar => funciona
  4. %CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt"
  5. En el editor de texto, agregue otra línea e intente guardar => "Acceso denegado"

WTF ?! ¿Cómo puedo depositar un archivo sin bloquearlo o liberar los identificadores de archivo después?

  • Los permisos de seguridad de Windows parecen estar completamente atornillados en el archivo:

    Permisos antes:

    permisos antes (Imagen!)

    Permisos después de:

    permisos después (¡Imagen!)

  • Sin embargo, funciona en el directorio de usuarios ( Desktop)

  • Verifiqué el archivo con LockHunter pero ningún proceso parece bloquear el archivo
  • Preguntas frecuentes de Cygwin menciona interferencias con algunos programas. Intentó desinstalar Antivir y Catalyst y reiniciar.
  • Probar UnxTools (se bloquea), GnuWin32 (sed no admite la sustitución in situ), Interex (el instalador no admite W7 Pro) ... * suspiro *
Pato Donald
fuente
2
Eso suena como la filosofía de Windows 'debe proteger a los usuarios de sí mismos', lo veo todo el tiempo cuando intento mezclar y combinar archivos de Windows y Cygwin / Linux. Buena suerte.
Shellter
+1 lambdor. Verifiqué este comportamiento en Cygwin y tienes razón. Esto es bastante raro El archivo no está bloqueado (es decir, ya que no está en uso). Los permisos de archivo de solo lectura / lectura y escritura se modifican.
He usado GnuWin32 sed en W7 de 64 bits y no tuve problemas con la sustitución en el lugar. Es sed 4.2.1 que descargué con el proyecto getGnuWin32 .
Spencer Rathbun

Respuestas:

8

correspondiente a la lista de correo de Cygwin , use noacl para el montaje

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

o directamente en Windows ../cygwin/fstabantes de iniciar Cygwin bash

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

Tuve exactamente el mismo problema después de usar find en combinación con grep y sed bajo cygwin para procesar automáticamente una carpeta llena de archivos de código fuente Java. Sed estropeó los permisos de mis archivos NTFS, que aún persistían después de un reinicio, así que busqué una manera fácil de solucionarlo.

En realidad, encontré una manera fácil de recuperar los permisos del archivo a los valores anteriores. Se puede hacer para una carpeta completa de forma recursiva, lo cual es importante para mí, ya que he modificado tantos archivos a la vez (varios cientos). Lamentablemente, solo sé los nombres alemanes para las entradas del menú, por lo que no estoy seguro de cómo se llaman las entradas del menú (en el Explorador de Windows) en inglés correcto.

En alemán, sí: haz clic derecho en la carpeta principal de la carpeta donde utilicé sed, "Eigenschaften" (menú contextual), "Sicherheit" (pestaña en el diálogo), "Erweitert" (botón), "Berechtigungen ändern ... "(botón con indicador UAC), ahora solo marco ambas casillas de verificación (la superior ya está configurada, pero la inferior no, pero tiene que estar). Ahora hago clic en "Aceptar" tres veces.

El cambio real que se realiza es que la casilla de verificación inferior obliga a Windows a reemplazar los permisos actuales para el contenido de la carpeta de forma recursiva con los permisos de la carpeta que hizo clic con el botón derecho, por lo que se corrigen todos los permisos rotos. Funcionó como un encanto para mí, y también es muy rápido (solo unos segundos para muchos archivos).

Posibles traducciones (adivinadas por mí):

  • "Eigenschaften" -> "Propiedades"
  • "Sicherheit" -> "Seguridad"
  • "Erweitert" -> "Avanzado"
  • "Berechtigungen ändern ..." -> "Cambiar permisos ..."
Rolf Viehmann
fuente
2

Ejecuté mi propio conjunto de pruebas y, de hecho, los permisos del archivo se establecen en r-xr-x --- después del comando sed y los comandos cygwin posteriores lo percibirán como un archivo de solo lectura.

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>

Estos permisos -r-xr-x --- impiden las escrituras posteriores de algunos programas:

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

Entonces, la solución sería agregar un chmod adicional en el archivo

C:\temp>chmod 777 test.txt
C:\temp>echo xxx > test.txt
C:\temp>
Stephen Quan
fuente
Lo extraño es la primera máscara de permisos '---------- + 1 bikeguy ????????' con el que también me encuentro usando Cygwin / Windows. Luego escribe 'Estos permisos -r-xr-x --- sí impiden las escrituras posteriores de algún software:' Entonces, tal vez el 'algún software' se ejecuta bajo un grupo diferente Y debido a que no hay acceso a través de 'otros' permisos, eso causa ¿el problema? Gracias, esta depuración me ha ayudado con este problema. Buena suerte a todos.
Shellter
Sí, @shellter también lo noté cuando estaba investigando la respuesta. Supuse que la línea '----------- +' significaba que no existe seguridad (por lo que tiene acceso completo) mientras que '-r-xr-x --- +' significa que existe seguridad donde el acceso de escritura es desaparecido. Si hice un chmod 000 también obtendré '---------- +' pero esta vez definitivamente hay seguridad y no tengo privilegios para leer o escribir este archivo.
Estoy usando git versión 1.9.5.msysgit.1, también veo el mismo problema, uso el chmod 777 test.txtcomando para solucionar este problema.
ollydbg23