Pythonの独自のドキュメントはos.fchmod
、os.chmod
のような関数を使用する方法については非常に簡潔です。私は777
のような数字とstat.S_IWRITE | stat.S_IEXEC
のような表現で混乱しています。Python3でファイル権限を設定する方法は?
そしてmode=0o777
私はos
モジュール内の一部の機能に何見ていますか?
あなたはこれが何であるかを説明してくださいことはできますか?
Pythonの独自のドキュメントはos.fchmod
、os.chmod
のような関数を使用する方法については非常に簡潔です。私は777
のような数字とstat.S_IWRITE | stat.S_IEXEC
のような表現で混乱しています。Python3でファイル権限を設定する方法は?
そしてmode=0o777
私はos
モジュール内の一部の機能に何見ていますか?
あなたはこれが何であるかを説明してくださいことはできますか?
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)
。
質問はos.fchmod()
に言及し、他の答えは唯一os.chmod
の使用が記載されているので、ここでは前者が何をするかですので:
os.fchmod(fd, mode);
fd
- ファイルポインタ(または記述子を、あなたがする場合)を設定します。
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アプリケーションやそのようなアプリケーションには適していません。
多くのリクエストを処理しなければならないWebアプリケーション内でこれを行うようにした場合、サブプロセスは非常に高価です。これは実際に新しいシェルを起動しているためです。 – Oz123
@ Oz123良い洞察下部に少しの免責事項を追加しました。 –
素敵な書きかけです。あなたが私がそれを付け加えたことに気をつけないといいですね。 –