私の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 に設定されます。なぜですか?

私の殻のUmaskは0077です。

答え1

umaskこれを実行すると、systemシェルで実行されます。umaskそのシェルのマスクは変更されますが、シェルはすぐに終了し、変更は失われます。

Pythonプロセスのumaskを変更するには、使用os.umask()、こうなります:

現在の数値umaskを設定し、古いumaskを返します。

これにより、すぐに終了する他のプログラムではなく、実行中のプログラムが変更されます。

答え2

これは完全に正常な動作ですが、目的の動作ではない可能性があります。

これらumask 055の設定は呼び出し全体にわたって持続するため、 os.systemPythonスクリプトの設定は変更されず、os.system()次の呼び出しで呼び出されるコマンドの設定も変更されません。

あなたがしなければならないことはこれです:

import os

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

答え3

特定の権限でデフォルトのシェルコマンドを実行するには、単一のシステムコールでコマンドをリンクするだけです。

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

になる:

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

または、前のコマンドが正常に終了した場合、2番目のコマンドを実行したい場合:

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

関連情報