Как изменить права доступа к файлу с помощью os.chmod при сохранении существующих разрешений? - PullRequest
0 голосов
/ 13 февраля 2019

Я пытаюсь выборочно изменить разрешения для пользователя, группы или других пользователей одновременно, но всякий раз, когда я использую chmod, все разрешения перезаписываются.


Я пытался работать вместетекущие права доступа к файлу с новым разрешением, как предлагается в документации chmod:

ex:

GROUP_RO = S_IRGRP #Group read only
current_permissions = stat.S_IMODE(os.stat(path).st_mode)

os.chmod(path, current_permissions | GROUP_RO)

Я также пытался использовать битовые маски.Я не мог придумать, как объединить битовые маски и где - если я изменяю пользовательские разрешения, я могу защитить / замаскировать как групповые, так и другие разрешения от изменения.

Я пытался использовать битовые маски следующим образом:

GROUP_RO = S_IRGRP #Group read only
USER_MASK = S_IRWXU

os.chmod(path, USER_MASK | GROUP_RO) #this works at preventing User permissions from being modified

Но соединение нескольких масок не дает:

USER_MASK = S_IRWXU
OTHERS_MASK = S_IRWXO

os.chmod(path, USER_MASK | OTHERS_MASK | GROUP_RO) #does not work

Я пробовал бесконечные комбинацииразличных битовых операторов и битовых масок, с текущими разрешениями или без них, и не повезло.


Что я хотел бы сделать:

# current permissions -> U: read only, G: read and write, O: write only
os.chmod(path, [whatever code making this work])
# new permissions -> U: read only, G: read only, O: write only

В любой ситуации,другие объекты не изменены.

1 Ответ

0 голосов
/ 13 февраля 2019

Все ваши попытки подходят довольно близко.Проблема в том, что оператор | не может отключить биты.Поэтому, когда вы делаете current_permissions | S_IRGRP, вы устанавливаете правильные биты, но не отключаете разрешение на запись.

Чтобы отключить биты, вам нужно &.Есть несколько хороших способов сделать это.

Один из вариантов, который я бы выбрал, вероятно, состоит в том, чтобы отменить все разрешения группы и установить для них то, что вы хотите:

(current_permissions & ~S_IRWXG) | S_IRGRP

Первая частьотменяет все разрешения для групп, а вторая часть применяет режим только для чтения, как и раньше.

Другой способ - отключить все, кроме пользовательских и других разделов, а затем установить группу:

(current_permissions & (S_IRWXU | S_IRWXO)) | S_IRGRP

два обычно эквивалентны, если в ваших разрешениях не установлены какие-то странные биты.

...