我正在尝试调试一个相当复杂的已安装和共享卷层次结构中的权限问题。失败的操作在以下 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
也许Python脚本vim
也可以。cat
echo
awk
我尝试的每个命令都只是创建一个具有 0644 权限的新文件。
答案1
我不知道有任何工具可以创建具有只读权限的读写文件描述符,因此我尝试使用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
答案2
我没有足够的声誉来将其标记为重复,但请看一下: 是否可以在命令行上设置权限来创建文件?
我想install -m 444 /dev/null newfile
会满足你的需要。