2015-12-17 38 views
11

Quella è la mia messa a punto:le autorizzazioni di gruppo di impostazioni con Python

ho una macchina virtuale (Ubuntu 14.04 LTS.), Dove è in esecuzione un database PostgreSQL/PostGIS.

Con Windows 7 in QGIS mi collego a questo database e carico feature layer nel mio progetto GIS.

Con un po 'di codice Python, creo un file con un ID tessera e alcune informazioni.

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(' ', '')) 

Il file ha il permesso:

-rwx------ 

voglio impostare anche le stesse autorizzazioni per il mio gruppo e altri.

-rwxrwxrwx 

ho provato:

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

Nessun successo.

Cosa stava lavorando è:

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

O

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

Perché non funziona il comando chmod?

Sotto UNIX, posso chmod questo file e sono lo stesso utente di Windows.

Ho anche provato il metodo os.chmod. Ma nessun successo.

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

Quando faccio un "chmod 777 file" in ambiente UNIX (Solaris) i permessi sono

-rwxrwxrwx 

Quello che posso fare ora è di declassare/rimuovere le autorizzazioni sotto Windows nel progetto GIS:

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

Con questo comm e ottengo un riscontro 0 nell'output della console python

Ho anche un riscontro 0 quando eseguo un chmod 777 sul nuovo file ma non succede nulla.

Il problema è che posso solo eseguire il downgrade delle autorizzazioni. Non riesco a impostare nuove autorizzazioni!

+0

È possibile stampare il ritorno di ogni 'subprocess.call (...)'? Aiuterà a localizzare il bug. –

+0

Stai eseguendo lo script sul computer Windows o Linux? Se l'unità H: è una cartella condivisa di Samba, l'esecuzione della mia risposta Windows sulla macchina Windows potrebbe funzionare. In caso contrario, potrebbe essere necessario impostare le autorizzazioni nel file '/ etc/samba/smb.conf' nel server Linux. –

+0

Sto eseguendo lo script in Windows. – Stefan

risposta

3

Qual è l'intenzione con il carattere r nei comandi della shell? Intendi metterlo di fronte all'intera stringa? Hai controllato quale file viene generato toccando?

Quando provo il vostro esempio, esegue il comando: , che sta creando il file rH:\path_to_file\file.txt

Questo funziona bene per me:

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

+0

Ho provato ancora una volta con i tuoi consigli, ma non funziona. Ho aggiornato la mia risposta. – Stefan

2

Prova questo (non ho una macchina Linux in questo momento per testarlo):

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

Se il nome file è fornito dall'utente, è necessario evitare shell=True per motivi di sicurezza. Si può provare:

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

Dal os module documentation:

Nota: Anche se Windows supporta chmod(), è possibile impostare solo flag di sola lettura del file con esso (attraverso lo stat.S_IWRITE e stat .S_IREAD costanti o un valore intero corrispondente). Tutti gli altri bit vengono ignorati.

Per le autorizzazioni di Windows, si gestiscono gli ACL. Adattamento da another answer, è necessario la libreria 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) 

Modificare il con.FILE_ALL_ACCESS bandiera per quelle che ti servono.

+0

Grazie per la risposta. Non ho ancora successo anche con i passaggi di questa risposta. Gli darò un ultimo tentativo domani. – Stefan

+0

Hai modificato la stringa "Il tuo nome utente" nel tuo vero nome utente? –