为什么我的 python 脚本无法更改 umask?

为什么我的 python 脚本无法更改 umask?

这是我的脚本

#!/usr/bin/python

import os

print "hello world from python"
os.system("echo 'hello world from bash'")
os.system("umask 055")
os.system("ls -alh > test")

如果我运行此代码,文件 test 的权限不会设置为 722,而是设置为 600。可能是什么原因?

我的shell的Umask是0077。

答案1

当您使用umask它运行时system,它会在 shell 中运行:umask更改该 shell 的掩码,但 shell 随后会立即终止并且更改会丢失。

要更改 Python 进程的 umask,使用os.umask(),这将:

设置当前数字 umask 并返回之前的 umask。

这样,更改将对您正在运行的程序进行,而不是对另一个随后立即终止的程序进行。

答案2

这是完全正常的行为,但可能不是您想要的。

这些umask 055设置在调用期间一直存在 os.system,因此它们永远不会更改 Python 脚本的设置,当然也不会更改下一次os.system()调用中调用的命令的设置。

你应该做的是这样的:

import os

old_mask = os.umask(055)
os.system("ls -alh > test")
os.umask(old_mask)

答案3

如果您希望底层 shell 命令以某些权限运行,可以通过在单个系统调用中链接命令来实现此目的。

os.system("umask 055")
os.system("ls -alh > test")

变成:

os.system("umask 055; ls -alh > test")

或者,如果您只想在前一个命令成功退出的情况下运行第二个命令:

os.system("umask 055 && ls -alh > test")

相关内容