18

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

bash シェルでは、

umask 0022

アクセス許可付きでファイルを作成できるようにします

-rw-r--r--

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

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

の許可を取得します

----------

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

第二に、両者の違いの論理は何ですか?

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

os.umask(18)

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

-----w--w-

また、私は試しました

os.umask(00022)

os.mask(0o0022)

どちらもうまくいきませんでした。

4

4 に答える 4

8

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

[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、ファイルの作成に使用しているモードから値が「減算」され、特定の場合にそのモードが何であるかがわからないことにも注意する必要があります。

モードのファイルを作成するときの値は、あなたが持っているものではなく、結果になるので、それはあなたのbashサンプルでも明らかです。umask022777r-xr-xr-xrw-r--r--


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

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あなたのケースで許可を得ているのか完全にはわかりません。

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

于 2012-04-24T02:57:50.457 に答える
8

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

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

finally:
    os.umask(old_umask)
于 2012-12-07T12:26:43.890 に答える
0

これは単純なシステム コールのように見えますが、この場合、使用している 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に同様のステートメントはありません

于 2016-03-23T19:16:35.610 に答える