web-dev-qa-db-ja.com

Pythonでos.umask()を使用する方法

Osモジュールを使用してumaskを設定しようとしています。 〜/ .profileに設定されている通常のumaskはumask0027であることに注意してください。

Bashシェルでは、

umask 0022

パーミッションでファイルを作成できるようになります

-rw-r--r--

ただし、osモジュールをインポートしてこれを行うと、次のようになります。

os.umask(0022)
[do some other code here that creates a file]

の権限を取得します

----------

まず、os.umask(mask)をシェルでumaskのように動作させるにはどうすればよいですか?

第二に、2つの違いの論理は何ですか?

注:次のようにして、小数が必要な場合に備えて、0022を小数に変換してみました。

os.umask(18)

しかしそれはの許可を与えました

-----w--w-

また、私は試しました

os.umask(00022)

そして

os.mask(0o0022)

どちらも機能しませんでした。

13
narnie

Umaskの誤解だと思います。 umaskは、デフォルトpermissionsではなく、デフォルトdenialsを設定します。そう

import os
oldmask = os.umask (0o22)
fh1 = os.open ("qq1.junk", os.O_CREAT, 0o777)
fh2 = os.open ("qq2.junk", os.O_CREAT, 0o022)
os.umask (oldmask)
os.close (fh1)
os.close (fh2)

実際に次のようにファイルを生成する必要があります。

-rwxr-xr-x 1 pax pax 0 Apr 24 11:11 qq1.junk
---------- 1 pax pax 0 Apr 24 11:11 qq2.junk

Umask 022は、グループなどの書き込みアクセスを削除します。これは、まさにそこで見られる動作です。 8進数が表す2進数に戻ると役立つことがわかりました。

 usr grp others 
-rwx rwx rwx is represented in octal as 0777, requested for qq1.junk
-000 010 010 umask of 022 removes any permission where there is a 1
-rwx r-x r-x is the result achieved requesting 0777 with umask of 022

---- -w- -w- is represented in octal as 0022, requested for qq2.junk
-000 010 010 umask of 022 removes any permission where there is a 1
---- --- --- is the result achieved requesting 0022 with umask of 022

プログラムは、必ずしも思ったとおりに動作しているわけではなく、要求どおりに動作しています。一般的な状況、それは、コンピュータで:-)

19
JimH44

おそらく、以下を構成するコードを表示する必要があります。

_[do some other code here that creates a file]
_

あなたが持っているコードは私のシステムでうまく機能します:

_import os
oldmask = os.umask (022)
fh1 = os.open ("qq1.junk", os.O_CREAT, 0777)
fh2 = os.open ("qq2.junk", os.O_CREAT, 0022)
os.umask (oldmask)
os.close (fh1)
os.close (fh2)
_

次のようにファイルを生成します。

_-rwxr-xr-x 1 pax pax 0 Apr 24 11:11 qq1.junk
---------- 1 pax pax 0 Apr 24 11:11 qq2.junk
_

また、古いumask値が復元され、ローカル操作に変更した場合の影響が最小限に抑えられることにも注意してください。

上記の結果からわかるように、ファイルの作成に使用しているモードからumask値が「減算」されており、そのモードが何であるかがわからないことにも注意する必要があります。あなたの特定のケース。

モード_022_のファイルを作成するときの_777_のbash値は、_r-xr-xr-x_ではなく_rw-r--r--_になるため、umaskサンプルでも明らかです。 SOMECODE)__お持ちのとおり。


_os.open_ではなくopenを使用していることを示す以下のコメントに基づくと、Pythonソースをざっと見ると、これが初期モードとして_0666_を使用するC fopen呼び出し。これは、わずかに変更されたコードによってサポートされています。

_import os
oldmask = os.umask (022)
fh3 = open ("qq3.junk", "w")
os.umask (0)
fh4 = open ("qq4.junk", "w")
os.umask (oldmask)
fh3.close()
fh4.close()
_

それは私たちに与えます:

_-rw-r--r-- 1 pax pax 0 Apr 24 11:44 qq3.junk
-rw-rw-rw- 1 pax pax 0 Apr 24 11:44 qq4.junk
_

したがって、あなたのケースで_0000_権限を取得している理由は完全にはわかりません。

上記のプログラムを環境で実行すると、結果がどうなるかを確認する価値があります。それが私が得るのと同じなら、問題はどこかにあるかもしれません。

8
paxdiablo

うるさい/注意深く、Python 3k互換であるため、ここに私のわずかに異なる答えがあります(それでもOPの元の問題が何であったかを説明していません):

old_umask = os.umask(0o022) # u=rwx,g=rx,o=rx
try:
    # do stuff

finally:
    os.umask(old_umask)
5
George Lund

これは単純なシステムコールのように見えますが、この場合、使用しているPythonバージョン:

Os.openは、Python 2.xとPython 3.xで、既存のumaskを異なる方法で処理しているようです。おそらく2.xが近いためです。 OSと3.xはもう少し抽象化を行います。

https://docs.python.org/2/library/os.html "デフォルトのモードは0777(8進数)で、現在のumask値が最初ですマスクアウト。 "

https://docs.python.org/3/library/os.html に同様のステートメントはありません

0
Jamieson Becker