web-dev-qa-db-ja.com

Pythonのファイル許可の変更

ファイルアクセスの許可を変更しようとしています。

os.chmod(path, mode)

私はそれを読み取り専用にしたい:

os.chmod(path, 0444)

ファイルを読み取り専用にする他の方法はありますか?

43
Abul Hasnat
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シノニム。

62
John La Rooy

os.chmod(path, 0444)isPython 2.xでファイル許可を変更するためのPythonコマンドです。 Python 2とPython 3を組み合わせたソリューションの場合、04440o444に変更します。

subprocess を使用して、常にPythonを使用してchmodコマンドを呼び出すことができます。ただし、これはLinuxでのみ機能すると思います。

import subprocess

subprocess.call(['chmod', '0444', 'path'])
28
Inbar Rose

現在のすべての回答は、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演算を実行します。

15
Chip Hogg

許可整数を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文字)。

0
Sheljohn

フラグを覚える必要はありません。いつでもできることを忘れないでください:

subprocess.call(["chmod", "a-w", "file/path])

移植性はありませんが、書きやすく覚えやすいです:

  • u-ユーザー
  • g-グループ
  • o-その他
  • a-すべて
  • +または-(許可の追加または削除)
  • r-読み取り
  • w-書き込み
  • x-実行

追加のオプションと詳細な説明については、man chmodを参照してください。

0
solgar