Настройка групповых разрешений с помощью python

Это моя настройка:

У меня есть VirtualMachine (Ubuntu 14.04. LTS), где работает база данных PostgreSQL/PostGIS.

С Windows 7 в QGIS я подключаюсь к этой базе данных и загружаю функциональный слой в свой проект ГИС.

С некоторым кодом python я создаю файл с идентификатором плитки и некоторой информацией.

import os
import io
import time

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
if lyr.name() == "fishnet_final":
    layer = lyr

for f in layer.selectedFeatures():
    pth = os.path.join(os.path.dirname(r'H:\path_to_file\'), str(f['name']) + "_" + str(time.strftime("%Y-%m-%d")) + "_" + str(f['country']) + ".txt")
    fle = open(pth,'wb')    
    fle.writelines(str(f['name']))
    fle.write('\n')
    fle.write(str(time.strftime("%Y-%d-%m")))
    fle.write('\n')
    fle.write(str(f['country']))
    fle.write('\n')
    fle.close()
    os.rename(pth, pth.replace(' ', ''))

У файла есть разрешения:

-rwx------

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

-rwxrwxrwx

Я пробовал:

import shlex
command=shlex.split("chmod 777 r'H:\path_to_file\file.txt'") 
subprocess.call(command)

Нет успеха.

Работает:

command=shlex.split("touch r'H:\path_to_file\file.txt'")

ИЛИ

command=shlex.split("rm r'H:\path_to_file\file.txt'")

Почему команда chmod не работает?

В UNIX я могу chmod этот файл, и я использую тот же пользователь, что и в Windows.

Я также пробовал метод os.chmod. Но никакого успеха.

import os, stat
st = os.stat(r'H:\path_to_file\file.txt')
os.chmod(r'H:\path_to_file\file.txt', st.st_mode | 0o111 )

UPDATE

Когда я делаю "файл chmod 777" под UNIX (Solaris), разрешения имеют

-rwxrwxrwx

Теперь я могу сделать снимок/удалить разрешения под Windows в проекте ГИС:

subprocess.call(r'chmod 400 "H:\path_to_file\file.txt"', shell=True)
0
-r-xr-xr-x

С помощью этой команды я получаю обратную связь 0 на выходе консоли python

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

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

Ответ 1

Из документация модуля os:

Примечание. Несмотря на то, что Windows поддерживает chmod(), вы можете установить с ней только флаг только для чтения (через константы stat.S_IWRITE и stat.S_IREAD или соответствующее целочисленное значение). Все остальные биты игнорируются.

Для разрешений Windows вы управляете списками ACL. Адаптация из другого ответа, вам нужна библиотека pywin32:

import win32security
import ntsecuritycon as con

FILENAME = r"H:\path_to_file\file.txt"

user, domain, type = win32security.LookupAccountName ("", "Your Username")

sd = win32security.GetFileSecurity(FILENAME, win32security.DACL_SECURITY_INFORMATION)
dacl = sd.GetSecurityDescriptorDacl()   # instead of dacl = win32security.ACL()

dacl.AddAccessAllowedAce(win32security.ACL_REVISION, con.FILE_ALL_ACCESS, user)

sd.SetSecurityDescriptorDacl(1, dacl, 0)   # may not be necessary
win32security.SetFileSecurity(FILENAME, win32security.DACL_SECURITY_INFORMATION, sd)

Измените флаг con.FILE_ALL_ACCESS на нужные вам.

Ответ 2

Каково намерение с символом r в командах оболочки? Вы хотите поставить его перед всей строкой? Вы проверили, какой файл создается прикосновением?

Когда я попробую ваш пример, он выполняет эту команду: ['touch', 'rH:\\path_to_file\x0cile.txt'], который создает файл rH:\path_to_file\file.txt

Это отлично работает для меня:

command=shlex.split("chmod 777 'H:\path_to_file\file.txt'") subprocess.call(command)

Ответ 3

Попробуйте (сейчас у меня нет Linux-машины, чтобы проверить его):

import subprocess
subprocess.call(r'chmod 777 "H:\path_to_file\file.txt"', shell=True)

Если имя файла предоставлено пользователем, вам следует избегать shell=True по соображениям безопасности. Вы можете попробовать:

filename = r"H:\path_to_file\file.txt"
subprocess.call(['chmod','777',filename])