1

Я пытаюсь отладить проблему разрешения в довольно сложной иерархии подключенных и общих томов. Неудачная операция фиксируется в следующих выходных данных strace:

open("/git/project.git/objects/12/tmp_obj_FNNWoD", O_RDWR|O_CREAT|O_EXCL, 0444) = 5
write(5, "x\1%\3121\16\3020\f@QfK\276\203\325=\250]\30\262q\222(\5\27,\245\216U\233\242"..., 109) = 109
close(5)                                = -1 EPERM (Operation not permitted)

Обратите внимание, что новый файл создан для чтения-записи, но с разрешениями 0444, что делает его доступным только для чтения. Что-то записано в файл, и файл закрыт. Так git создает временные файлы. Обычно это работает. Но он надежно отказывает на одном из подключенных томов, которые у меня есть.

Мне нужно выяснить, какой слой в иерархии общих папок вызывает проблему, поэтому я хотел бы попробовать его на разных уровнях иерархии. Проблема в том, что эту ошибку сложно симулировать. Для этого требуется установить git, мне нужно инициализировать новый репозиторий git, добавить в него файлы и т.д.

Есть ли способ сделать эту последовательность системных вызовов с помощью некоторых распространенных инструментов Linux? Под стандартной программой я имею в виду что-то вроде sed , vim , cat , echo , awk ... Может быть, скрипт на python тоже подойдет.

Каждая команда, которую я пробовал, просто создает новый файл с разрешением 0644.

2 ответа2

0

У меня недостаточно репутации, чтобы пометить это как дубликат, но взгляните на это:можно ли создавать файлы с разрешениями, установленными в командной строке?

Я думаю, что install -m 444 /dev/null newfile сделает то, что вам нужно.

0

Я не знаю каких-либо инструментов, которые создают дескриптор файла для чтения и записи с правами только для чтения, поэтому я попробовал сделать это с помощью python3.4 . Я думаю, что это должно повторять поведение, на которое вы ссылались в исходном коде 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)

После запуска скрипта:

$ ls -al file.txt 
-r--r--r-- 1 karl karl 15 Dec  3 12:00 file.txt
$ cat file.txt 
this is a test 

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .