Simular a criação e gravação de um arquivo somente leitura

1

Estou tentando depurar um problema de permissão em uma hierarquia complexa de volumes montados e compartilhados. A operação que falha é capturada na seguinte saída de strace:

open("/git/project.git/objects/12/tmp_obj_FNNWoD", O_RDWR|O_CREAT|O_EXCL, 0444) = 5
write(5, "x%2120\f@QfK635=0]2q2(,56U32"..., 109) = 109
close(5)                                = -1 EPERM (Operation not permitted)

Observe que um novo arquivo é criado para leitura-gravação, mas com permissões 0444, o que o torna somente leitura. Algo é gravado em um arquivo e o arquivo é fechado. É assim que o git cria arquivos temporários . Geralmente funciona. Mas falha de forma confiável em um dos volumes montados que tenho.

Eu preciso descobrir qual camada na hierarquia de pastas compartilhadas está causando o problema, então gostaria de testá-lo em diferentes níveis da hierarquia. O problema é que esse erro é difícil de simular. Ele requer que o git seja instalado, eu preciso inicializar o novo repositório git e adicionar arquivos a ele, etc.

Existe uma maneira de fazer essa sequência de chamadas do sistema com algumas ferramentas comuns do Linux? Por programa padrão, quero dizer algo como sed , vim , cat , echo , awk ... Talvez um script python também funcione.

Todos os comandos que tentei criam um novo arquivo com a permissão 0644.

    
por Prvaak 02.12.2015 / 15:33

2 respostas

0

Eu não conheço nenhuma ferramenta que crie um descritor de arquivo de leitura / gravação com permissões de somente leitura, então usei python3.4 . Eu acho que isso deve replicar o comportamento que você referenciou no código-fonte do git.

#!/usr/bin/env python3.4
import os

if __name__ == '__main__':
    fd = os.open('file.txt', os.O_CREAT | os.O_EXCL | os.O_RDWR, 0o444)
    os.write(fd, 'this is a test\n'.encode())
    os.close(fd)

Depois de executar o script:

$ ls -al file.txt 
-r--r--r-- 1 karl karl 15 Dec  3 12:00 file.txt
$ cat file.txt 
this is a test 
    
por 03.12.2015 / 23:11
0

Eu não tenho representante suficiente para sinalizar isso como duplicado, mas dê uma olhada nisso: Arquivos podem ser criados com permissões definidas em a linha de comando?

Acho que install -m 444 /dev/null newfile fará o que você precisa.

    
por 02.12.2015 / 20:49