这是我的脚本
#!/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")