2017-06-28 10 views
2

Pythonの独自のドキュメントはos.fchmodos.chmodのような関数を使用する方法については非常に簡潔です。私は777のような数字とstat.S_IWRITE | stat.S_IEXECのような表現で混乱しています。Python3でファイル権限を設定する方法は?

そしてmode=0o777私はosモジュール内の一部の機能に何見ていますか?

あなたはこれが何であるかを説明してくださいことはできますか?

答えて

3

OK。最初から始めましょう。あなたがLinuxを知っていればchmodあなたはすでに理解する正しい道です。 Pythonの2では、

単にあなたのDjangoプロジェクトの例のために行うことができます:

>>> os.chmod('manage.py', 0666) 

を、今、あなたはアクセス権が変更されていることがわかります。

git diff 
diff --git a/manage.py b/manage.py 
old mode 100755 
new mode 100644 

ザ・Pythonはあなただけ見て呼び出しますbashで実行するのと直接同等です:

chmod 0666 manage.py 

後でPythonのバージョン8進数でos機能を使用することができます。

>>> os.chmod('manage.py', 0o666) 

これは、初めに奇妙に見えるかもしれません。しかし、それはpep3127で導入された新しい文法です。だから、0に続けて8進数をつけたPythonにフィードする代わりに、Pythonに0oと続く8進数を与えます。

最後に、statモジュールは、あなたがそれらのビットごとのOR演算で組み合わせることができ、数値定数を持っています。それは非常に冗長ですが、それを見てみましょう。

>>> stat.S_IRUSR # this means user read permissions 
256 

整数のように見えます。しかし、実際には、os.chmodによって進数として解釈されますが、そのようにこれを読む必要がありますので:

>>> "{0:b}".format(stat.S_IRUSR) 
'100000000' 
>>>"{0:b}".format(stat.S_IWUSR) 
'10000000' 

[OK]を、それは混乱だが、それぞれの結果にlenをチェックアウトし、前者は1ビット長く

>>> len("{0:b}".format(stat.S_IWUSR)) 
8 
>>> len("{0:b}".format(stat.S_IRUSR)) 
9 
ですあなたはを疑問に思う場合

>>> "{0:b}".format(stat.S_IRUSR|stat.S_IWUSR) # this is read and write for the user 
'110000000' 

我々は適切な目的のファイルモードを取得するために、これらのstatの定数を組み合わせることができますここではベースと同じパイプではありません。これはbitwise ORです。ビットワイズの組み合わせでは、両方の正のビットをとり、最初の2ビットが1に設定された9の長さの結果を返しました。つまり、ユーザーはファイルの書き込みを読み取ることができます。

>>> "{0:b}".format(stat.S_IRUSR|stat.S_IWUSR|stat.S_IWGRP|stat.S_IRGRP) 
'110110000' 

これはbashで通常のchmodように見える開始:この

チェック

$ chmod 0660 manage.py 
$ ls -l manage.py 
-rw-rw---- 1 oznt oznt 805 Mar 31 16:38 manage.py 

バッシュは、1または0のように、だけでなく、それらの意味としてだけではなく、上にあるビットを表し、 。したがって、左から2番目のビットはユーザーの読み取り許可、3番目はユーザーの書き込み許可です。そして、次のグループのビットはグループのアクセス許可などです。

os.chmod('manage.py', stat.S_IWGRP | stat.S_IRGRP | stat.S_IRUSR | stat.S_IWUSR | stat.S_IWOTH | stat.S_IROTH) 

そして、それが長すぎる場合、あなたが行うことができますことを改めて確認してください:

最後に、あなたはPythonでこれにbashでモード666を組み合わせることができos.chmod('manage.py', 0o666)

+0

素敵な書きかけです。あなたが私がそれを付け加えたことに気をつけないといいですね。 –

0

質問はos.fchmod()に言及し、他の答えは唯一os.chmodの使用が記載されているので、ここでは前者が何をするかですので:

os.fchmod(fd, mode); 
  1. fd - ファイルポインタ(または記述子を、あなたがする場合)を設定します。

  2. mode - ファイルに設定されるアクセス許可。 os.chmod/os.fchmodを使用して設定することができます

権限:

stat.S_ISUID設定UIDビット詳細は以下。

stat.S_ISGIDセットグループIDビット。このビットにはいくつか特別な用途があります。 についてディレクトリが、それはBSDのセマンティクスは、その ディレクトリに使用されることを示しています。そこに作成されたファイルは、作成プロセスの実効グループIDからではなく、 ディレクトリから自分のグループIDを継承し、 やディレクトリもあり得るでしょう作成しましたS_ISGIDビットがセットされる。グループ実行ビット(S_IXGRP)が設定されていない ファイルの場合、 セットグループIDビットは、必須のファイル/レコードのロックを示します( S_ENFMTも参照)。

stat.S_ISVTXスティッキービット。このビットがディレクトリに設定されている場合、そのディレクトリのファイルは ファイルの所有者、ディレクトリの所有者、特権者の プロセスによってのみ変更または削除できます。

stat.S_IRWXUファイル所有者のアクセス許可のマスク。

stat.S_IRUSRオーナーに読み取り権があります。

stat.S_IWUSRオーナーに書き込み権限があります。

stat.S_IXUSRオーナーには実行権限があります。

stat.S_IRWXGグループ権限のマスク。

stat.S_IRGRPグループに読み取り権があります。

stat.S_IWGRPグループに書き込み権限があります。

stat.S_IXGRPグループには実行権限があります。

stat.S_IRWXO他人(グループではない)のアクセス許可のマスク。

stat.S_IROTH他にも読み取り権限があります。

stat.S_IWOTH他にも書き込み権限があります。

stat.S_IXOTH他には実行権限があります。

stat.S_ENFMT System Vファイルのロックが強制されます。このフラグは、 とS_ISGIDで共有されています。 にグループ実行ビット(S_IXGRP)が設定されていないファイルでは、ファイル/レコードのロックが強制されます。

stat.S_IREAD S_IRUSRのUnix V7シノニム。

stat.S_IWRITE S_IWUSRと同義のUNIX V7シノニム。

stat.S_IEXEC UNIX V7のS_IXUSRと同義です。

statのドキュメントも同じです。

import subprocess 
subprocess.call(['chmod', '777', 'foo.txt']) 

ことに注意してください:

import os 
import sys 
import stat 

fd = os.open("foo.txt", os.O_RDONLY) 
os.fchmod(fd, stat.S_IXGRP) # Set a file execute by the group. 
os.fchmod(fd, stat.S_IWOTH) # Set a file write by others. 
os.close(fd) 

権限を設定するosモジュールを使用する代わりにsubprocessモジュールは次のとおりです。ここで

os.fchmodを使用してモードを変更する方法の例ですサブシェルを作成して /bin/chmodを直接呼び出しているので、これは高価な操作です。これは、多くの要求が同時に処理されなければならないWebアプリケーションやそのようなアプリケーションには適していません。

+0

多くのリクエストを処理しなければならないWebアプリケーション内でこれを行うようにした場合、サブプロセスは非常に高価です。これは実際に新しいシェルを起動しているためです。 – Oz123

+0

@ Oz123良い洞察下部に少しの免責事項を追加しました。 –

関連する問題