Cygwin bash sed bloqueia meus arquivos

12

Quando altero os arquivos no cygwin bash com o comando sed, o arquivo é bloqueado.

Reproduzir:

  1. Abrir cmde cdpara o diretório não-usuário (fe temp)
  2. echo aaa > test.txt
  3. Abra no editor de texto, adicione linha, tente salvar => funciona
  4. %CYGWIN_HOME%\bin\bash -c "sed -i 's/aaa/bbb/' test.txt"
  5. No editor de texto, adicione outra linha e tente salvar => "Acesso negado"

WTF ?! Como sedar um arquivo sem travar ou liberar as alças de arquivo depois?

  • As permissões de segurança do Windows parecem estar completamente danificadas no arquivo:

    Permissões antes:

    permissões antes (Imagem!)

    Permissões após:

    permissões após (Imagem!)

  • No entanto, funciona no diretório do usuário ( Desktop)

  • Eu verifiquei o arquivo com o LockHunter, mas nenhum processo aparece para bloquear o arquivo
  • O FAQ do Cygwin menciona interferências em alguns programas. Tentou desinstalar o Antivir e o Catalyst e reiniciar.
  • Tentando UnxTools (falhas), GnuWin32 (sed não suporta substituição no local), Interex (o instalador não suporta W7 Pro) ... * suspiro *
Pato Donald
fonte
2
Isso apenas soa como a filosofia do Windows 'deve proteger os usuários de si mesmos', vejo isso o tempo todo ao tentar misturar e combinar arquivos do Windows e Cygwin / Linux. Boa sorte.
shellter
+1 lambdor. Eu verifiquei esse comportamento no Cygwin e você está certo. Isso é bem estranho. O arquivo não está bloqueado (ou seja, como não está em uso). As permissões de arquivo somente leitura / leitura e gravação são modificadas.
Eu usei o GnuWin32 sed no W7 64bit e não tive problemas com a substituição no local. É o sed 4.2.1 que baixei com o projeto getGnuWin32 .
Spencer Rathbun

Respostas:

8

correspondente ao Cygwin Mailinglist , use noacl para montar

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

ou diretamente no Windows ../cygwin/fstabantes de iniciar o Cygwin bash

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

Eu tive exatamente o mesmo problema depois de usar o find em combinação com grep e sed sob cygwin para processar uma pasta cheia de arquivos de código-fonte Java automaticamente. Sed atrapalhou as permissões de arquivos NTFS dos meus arquivos, que ainda eram persistentes após a reinicialização, então procurei uma maneira fácil de corrigir isso.

Na verdade, encontrei uma maneira fácil de obter as permissões de arquivo de volta aos valores antigos. Isso pode ser feito para uma pasta inteira recursivamente, o que é importante para mim, pois modifiquei muitos arquivos de uma só vez (várias centenas). Infelizmente, eu sei apenas os nomes em alemão para as entradas do menu, então não tenho certeza de como as entradas do menu (no Windows Explorer) são chamadas no inglês correto.

Em alemão, você faz: Clique com o botão direito do mouse na pasta pai da pasta em que usei sed, "Eigenschaften" (menu de contexto), "Sicherheit" (guia na caixa de diálogo), "Erweitert" (botão), "Berechtigungen ändern ... "(botão com o prompt do UAC), agora apenas marquei as duas caixas de seleção (a superior já está definida, mas a inferior não, mas precisa ser). Agora clico em "OK" por três vezes.

A alteração real feita com isso é que a caixa de seleção inferior força o Windows a substituir recursivamente as permissões atuais para o conteúdo da pasta pelas permissões da pasta que você clicou com o botão direito, para que todas as permissões quebradas sejam corrigidas. Funcionou como um encanto para mim e também é realmente rápido (apenas alguns segundos para muitos arquivos).

Traduções possíveis (adivinhadas por mim):

  • "Eigenschaften" -> "Propriedades"
  • "Sicherheit" -> "Segurança"
  • "Erweitert" -> "Avançado"
  • "Berechtigungen ändern ..." -> "Alterar permissões ..."
Rolf Viehmann
fonte
2

Eu executei meu próprio conjunto de testes e, de fato, as permissões do arquivo são definidas como r-xr-x --- após o comando sed e os comandos cygwin subsequentes perceberem isso como um arquivo somente leitura.

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>

Essas permissões -r-xr-x --- impedem gravações subsequentes de alguns softwares:

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

Portanto, a solução alternativa seria adicionar um chmod adicional no arquivo

C:\temp>chmod 777 test.txt
C:\temp>echo xxx > test.txt
C:\temp>
Stephen Quan
fonte
o estranho é a primeira máscara de permissões '---------- + 1 bikeguy ????????' que eu também encontro usando o Cygwin / Windows. Em seguida, você escreve 'Essas permissões -r-xr-x --- impedem gravações subsequentes de algum software:' Então, talvez o 'algum software' seja executado em um grupo diferente E porque não há acesso através de outras permissões, o que causa o problema? Obrigado, esta depuração me ajudou com esse problema. Boa sorte a todos.
shellter
Sim, @shellter notei isso também quando estava pesquisando a resposta. Eu assumi que a linha '----------- +' significava que não existe segurança (para que você tenha acesso total), enquanto '-r-xr-x --- +' significa segurança existente onde o acesso de gravação é ausência de. Se eu fiz um chmod 000, também receberei '---------- +', mas desta vez definitivamente há segurança e não tenho privilégios para ler ou gravar este arquivo.
Estou usando a versão 1.9.5.msysgit.1 do git, também vejo o mesmo problema, uso o chmod 777 test.txtcomando para solucionar esse problema.
ollydbg23