Вопрос по python, file-permissions – Изменение разрешения файла в Python

36

Я пытаюсь изменить разрешение доступа к файлу:

os.chmod(path, mode)

Я хочу сделать это только для чтения:

os.chmod(path, 0444)

Есть ли другой способ сделать файл доступным только для чтения?

Если вы хотите спроситькак использовать символические имена разрешений и что они означают?Ваша артикуляция имеет серьезные недостатки. tripleee
я думаю, что это просто установка немного и поэтому, когда вы или они вместе, вы получаете 0444 Joran Beasley
Я видел некоторые, как S_IRUSR .. как это работает ??? Abul Hasnat

Ваш Ответ

5   ответов
13

без написания разрешения: они делают файл читаемым, но не исполняемым для всех. Конечно, это потому, что первоначальный вопрос444 разрешения - но мы можем сделать лучше!

Вот's решение, которое оставляет всех людей "читать" а также "выполнить» биты нетронутыми. Я написал подробный код, чтобы его было легко понять; Вы можете сделать это более кратким, если хотите.

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)

Почему это работает?

КакДжон Ла Рой указал,stat.S_IWUSR в основном означаетбитовая маска для пользователяs разрешения на запись ", Мы хотим установить соответствующий бит разрешения равным 0. Для этого нам понадобитсяпрямо противоположное битовая маска (то есть одна с 0 в этом месте и 1 'повсюду).~ оператор, который переворачивает все биты, дает нам именно это. Если мы применим это к любой переменной через "поразрядно и " оператор (&), это будет z, вычеркнуть соответствующий бит.

Нам нужно повторить эту логику сгруппа» а также "Другой" биты разрешения тоже. Здесь мы можем сэкономить время, просто&объединяя их все вместе (образуяNO_WRITING битовая константа).

Последний шаг заключается вполучить текущий файлс разрешенияи на самом деле выполнить побитовую операцию.

кажется, что должен быть более краткий способ сделать это. Catskul
27

os.chmod(path, 0444) является команда Python для изменения прав доступа к файлам в Python 2.x. Для комбинированного решения Python 2 и Python 3 измените0444 к0o444

Вы всегда можете использовать Python для вызова команды chmod, используяsubprocess, Я думаю, что это будет работать только на Linux, хотя.

import subprocess

subprocess.call(['chmod', '0444', 'path'])
Не берите в голову мой комментарий! Извините, Инбар Роуз. Вы'хорошо. Очевидно, 0444 прекрасно работает в Python 2.x. Однако это вызывает ошибку SyntaxError в Python 3.x. Чтобы это исправить, просто сделайте 0o444 вместо этого в Python 3.x. Shule
os.chmod может быть правильной функцией, но 0444 (вos.chmod(path, 0444)), поскольку int собирается вызвать SyntaxError (из-за ведущего 0), а в строковой форме он выиграл 'дать желаемый эффект. Вы должны перевести число в систему чисел, которую использует метод, которая нет то же самое. Может быть, вы знали это, но другие могут не знать. Shule
Независимый от версии способ получения восьмеричного числа будет: int ("444", 8) Обратите внимание, однако, что другой ответ, который предлагает использовать символические значения, определенные в модуле статистики, возможно, более чистый. YitzikC
Это не работает для файла на другом сервере. Можете ли вы предложить для этого случая. Спасибо Neo
58
os.chmod(path, stat.S_IRUSR | stat.S_IRGRP | stat.S_IROTH)

стат

Следующие флаги также можно использовать в аргументе mode функции os.chmod ():

stat.S_ISUID Установите бит UID.

stat.S_ISGID Установить идентификатор группы бит. Этот бит имеет несколько специальных применений. Для каталога это указывает, что семантика BSD должна использоваться для этого каталога: файлы, созданные там, наследуют идентификатор своей группы из каталога, а не от эффективного идентификатора группы процесса создания, и каталоги, созданные там, также получат установленный бит 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 Система V принудительно блокирует файлы. Этот флаг используется совместно с S_ISGID: блокировка файлов / записей применяется к файлам, для которых не установлен бит выполнения группы (S_IXGRP).

stat.S_IREAD Unix V7 синоним для S_IRUSR.

stat.S_IWRITE Unix V7 синоним для S_IWUSR.

stat.S_IEXEC Unix V7 синоним для S_IXUSR.

@Shule| более уместно при комбинировании битов из двух битовых масок. Однако, если каждая маска имеет только один отдельный бит, как и все константы в ответе выше, тогда+ эквивалентно. ws_e_c421
Константы вstat просто удобство удобочитаемого сахара.S_IRUSR это 0400,S_IRGRP 040,S_IROTH 4; объединение их с побитовым ИЛИ дает 0444. Вы можете просто добавить их вместо этого, но в общем случае ИЛИ будет правильным, потому что оно будет работать, даже если есть перекрывающиеся биты (0444 ИЛИ 0444 равно 0444, тогда как сложение даст другое и неправильное значение ). tripleee
Вы должны остерегаться остроумия+ при манипулировании существующим режимом. Если режим уже установлен, то+ победил'работать, но| будут. Например.,mode = stat.S_IWUSR + stat.S_IRUSR; ... some code ...; mode = mode + stat.S_IWUSR; победил'не работает, но последняя команда будет работать с.| mxmlnkn
Там'Нет объяснения этому, вы должны прочитать комментарии, комментарии или ссылку, чтобы понять это, если вы уже не знаете, что делает статистика. Просто небольшое объяснение сделало бы это намного лучше. DonyorM
С помощью+ также, кажется, работает вместо|, Я нене знаю, есть лиЭто причина использовать один над другим. Shule
0

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

Не переносимо, но легко написать и запомнить:

ты - пользовательг - группао - другоеа - все+ или - (добавить или удалить разрешение)r - читатьw - написатьх - выполнить

обращатьсяman chmod для дополнительных опций и более подробного объяснения.

Основная проблема с этим подходом заключается в том, что онпредполагает это'в Unix-подобной системе. Это н'т портативный, потому что это неработает на Windows. Вы должны использоватьos.chmod как предложено в Гитаноответ. code_dredd
7

python 2, так и для python3):

os.chmod(path, 0o444)

Похожие вопросы