ファイルアクセスの許可を変更しようとしています。
os.chmod(path, mode)
私はそれを読み取り専用にしたい:
os.chmod(path, 0444)
ファイルを読み取り専用にする他の方法はありますか?
os.chmod(path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)
次のフラグは、os.chmod()のモード引数でも使用できます。
stat.S_ISUID
UIDビットを設定します。
stat.S_ISGID
Set-group-IDビット。このビットにはいくつかの特別な用途があります。ディレクトリの場合、BSDセマンティクスがそのディレクトリに使用されることを示します:そこに作成されたファイルは、作成プロセスの有効なグループIDからではなく、ディレクトリからグループIDを継承し、そこに作成されたディレクトリもS_ISGIDビットセットを取得します。グループ実行ビット(S_IXGRP)が設定されていないファイルの場合、set-group-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
S_IXUSRのUnix V7シノニム。
os.chmod(path, 0444)
isPython 2.xでファイル許可を変更するためのPythonコマンドです。 Python 2とPython 3を組み合わせたソリューションの場合、0444
を0o444
に変更します。
subprocess
を使用して、常にPythonを使用してchmodコマンドを呼び出すことができます。ただし、これはLinuxでのみ機能すると思います。
import subprocess
subprocess.call(['chmod', '0444', 'path'])
現在のすべての回答は、non-writingパーミッションを覆します:彼らは、誰でもファイルを読み取り可能だが実行不可能にします。確かに、これは最初の質問で444
の許可を求められたためです。
これは、個々の「読み取り」ビットと「実行」ビットをすべてそのままにしておくソリューションです。わかりやすくするために詳細なコードを書きました。必要に応じて、より簡潔にすることができます。
import os
import stat
def remove_write_permissions(path):
"""Remove write permissions from this path, while keeping all other permissions intact.
Params:
path: The path whose permissions to alter.
"""
NO_USER_WRITING = ~stat.S_IWUSR
NO_GROUP_WRITING = ~stat.S_IWGRP
NO_OTHER_WRITING = ~stat.S_IWOTH
NO_WRITING = NO_USER_WRITING & NO_GROUP_WRITING & NO_OTHER_WRITING
current_permissions = stat.S_IMODE(os.lstat(path).st_mode)
os.chmod(path, current_permissions & NO_WRITING)
なぜこれが機能するのですか?
John La Rooyが指摘した 、stat.S_IWUSR
は、基本的に「ユーザーの書き込み許可のビットマスク」を意味します。対応する許可ビットを0に設定する必要があります。そのためには、exact inverseビットマスク(つまり、その場所に0を持つビットマスク、および1は他のどこでも)。すべてのビットを反転する~
演算子は、まさにそれを提供します。これを「ビット単位のand」演算子(&
)を介して任意の変数に適用すると、対応するビットがゼロになります。
「グループ」および「その他」の許可ビットでもこのロジックを繰り返す必要があります。ここでは、&
をすべて一緒に(NO_WRITING
ビット定数を形成)するだけで時間を節約できます。
最後のステップは 現在のファイルのパーミッションを取得する で、実際にビット単位のAND演算を実行します。
許可整数を8進数で含めるだけです(python 2とpython3の両方で機能します):
os.chmod(path, 0o444)
ここで参考になるのは、9文字の許可文字列(例: 'rwsr-x-wt')をos.chmod()
で使用できるマスクに変換する関数です。
def perm2mask(p):
assert len(p) == 9, 'Bad permission length'
assert all(p[k] in 'rw-' for k in [0,1,3,4,6,7]), 'Bad permission format (read-write)'
assert all(p[k] in 'xs-' for k in [2,5]), 'Bad permission format (execute)'
assert p[8] in 'xt', 'Bad permission format (execute other)'
m = 0
if p[0] == 'r': m |= stat.S_IRUSR
if p[1] == 'w': m |= stat.S_IWUSR
if p[2] == 'x': m |= stat.S_IXUSR
if p[2] == 's': m |= stat.S_IXUSR | stat.S_ISUID
if p[3] == 'r': m |= stat.S_IRGRP
if p[4] == 'w': m |= stat.S_IWGRP
if p[5] == 'x': m |= stat.S_IXGRP
if p[5] == 's': m |= stat.S_IXGRP | stat.S_ISGID
if p[6] == 'r': m |= stat.S_IROTH
if p[7] == 'w': m |= stat.S_IWOTH
if p[8] == 'x': m |= stat.S_IXOTH
if p[8] == 't': m |= stat.S_IXOTH | stat.S_ISVTX
return m
SUID/SGID/SVTXビットを設定すると、対応する実行ビットが自動的に設定されることに注意してください。これがないと、結果の許可は無効になります(ST
文字)。
フラグを覚える必要はありません。いつでもできることを忘れないでください:
subprocess.call(["chmod", "a-w", "file/path])
移植性はありませんが、書きやすく覚えやすいです:
追加のオプションと詳細な説明については、man chmod
を参照してください。