使用python设置组权限



这是我的设置:

我有一个虚拟机(Ubuntu 14.04。LTS),其中运行PostgreSQL/PostGIS数据库。

使用QGIS中的Windows7,我连接到这个数据库,并将特征层加载到我的GIS项目中。

使用一些python代码,我创建了一个带有tile ID和一些信息的文件。

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_filefile.txt'") 
subprocess.call(command)

没有成功。

起作用的是:

command=shlex.split("touch r'H:path_to_filefile.txt'")

command=shlex.split("rm r'H:path_to_filefile.txt'")

为什么不使用chmod命令?

在UNIX下,我可以修改这个文件,而且我和Windows中的用户是一样的。

我还尝试了os.chmod方法。但没有成功。

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

更新

当我在UNIX(Solaris)下执行"chmod 777文件"时,权限是

-rwxrwxrwx

我现在能做的是在GIS项目中降级/删除Windows下的权限:

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

使用此命令,我在python控制台输出中获得0反馈

当我对新文件执行chmod 777时,我也得到了0反馈,但什么都没发生。

问题是我只能降级权限。我无法设置新权限

来自操作系统模块文档:

注意:尽管Windows支持chmod(),但您只能用它设置文件的只读标志(通过stat.s_IWRITE和stat.s_IREAD常量或相应的整数值)忽略所有其他位

对于Windows权限,您可以管理ACL。根据另一个答案改编,您需要pywin32库:

import win32security
import ntsecuritycon as con
FILENAME = r"H:path_to_filefile.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标志更改为所需的标志。

shell命令中的r字符的意图是什么?你的意思是把它放在整根绳子的前面吗?你检查过哪个文件是通过触摸生成的吗?

当我尝试您的示例时,它运行以下命令:['touch', 'rH:\path_to_filex0cile.txt'],即创建文件rH:path_to_filefile.txt

这对我来说很好:

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

试试这个(我现在没有Linux机器来测试它):

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

如果文件名是用户提供的,出于安全原因,应避免使用shell=True。你可以试试:

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

相关内容

  • 没有找到相关文章

最新更新