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)
どちらも機能しませんでした。
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
プログラムは、必ずしも思ったとおりに動作しているわけではなく、要求どおりに動作しています。一般的な状況、それは、コンピュータで:-)
おそらく、以下を構成するコードを表示する必要があります。
_[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
_権限を取得している理由は完全にはわかりません。
上記のプログラムを環境で実行すると、結果がどうなるかを確認する価値があります。それが私が得るのと同じなら、問題はどこかにあるかもしれません。
うるさい/注意深く、Python 3k互換であるため、ここに私のわずかに異なる答えがあります(それでもOPの元の問題が何であったかを説明していません):
old_umask = os.umask(0o022) # u=rwx,g=rx,o=rx
try:
# do stuff
finally:
os.umask(old_umask)
これは単純なシステムコールのように見えますが、この場合、使用している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 に同様のステートメントはありません