2015-12-17 12 views
11

Das ist mein Setup ist:Einstellung Gruppenberechtigungen mit Python

Ich habe eine Virtuelle Maschine (Ubuntu 14.04 LTS.), Wo es eine PostgreSQL/PostGIS-Datenbank ausgeführt wird.

Mit Windows 7 in QGIS stelle ich eine Verbindung zu dieser Datenbank her und lade den Feature-Layer in mein GIS-Projekt.

Mit etwas Python-Code erstelle ich eine Datei mit einer Kachel-ID und einigen Informationen.

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

Die Datei hat die Berechtigungen:

-rwx------ 

ich auch die gleichen Berechtigungen für meine Fraktion und andere festlegen möchten.

-rwxrwxrwx 

Ich habe versucht:

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

Kein Erfolg.

Was funktionierte ist:

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

ODER

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

Warum funktioniert nicht den Befehl chmod?

Unter UNIX kann ich diese Datei chmod und ich bin der gleiche Benutzer wie in Windows.

Ich habe auch die Methode os.chmod ausprobiert. Aber kein Erfolg.

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

Wenn ich eine "chmod 777 Datei" unter UNIX (Solaris) die Berechtigungen sind

-rwxrwxrwx 

Was kann ich jetzt tun ist herabzustufen/Entfernen von Berechtigungen unter Windows im GIS-Projekt:

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

Mit diesem comm und ich bekomme ein 0 Feedback in der Python-Konsole Ausgabe

ich auch ein 0 Feedback bekommen, wenn ich einen chmod 777 auf die neue Datei zu tun, aber nichts passiert.

Das Problem ist, dass ich nur Berechtigungen herabstufen kann. Ich kann keine neuen Berechtigungen festlegen!

+0

Können Sie die Rückgabe jedes 'subprocess.call (...)' drucken? Es wird helfen, den Fehler zu finden. –

+0

Führen Sie das Skript auf dem Windows- oder Linux-Rechner aus? Wenn das Laufwerk H: ein freigegebener Samba-Ordner ist, funktioniert möglicherweise die Windows-Antwort auf dem Windows-Computer. Ist dies nicht der Fall, müssen Sie möglicherweise Berechtigungen in der Datei "/ etc/samba/smb.conf" auf dem Linux-Server festlegen. –

+0

Ich führe das Skript in Windows. – Stefan

Antwort

3

Was ist die Absicht mit dem r-Zeichen in Ihren Shell-Befehlen? Willst du es vor die ganze Saite stellen? Haben Sie überprüft, welche Datei durch Berührung erzeugt wird?

Wenn ich dein Beispiel versuchen, läuft es diesen Befehl ein: , dh die Erstellung der Datei rH:\path_to_file\file.txt

Das ist für mich gut funktioniert:

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

+0

Ich habe es noch einmal mit Ihren Ratschlägen versucht, aber es funktioniert nicht. Ich habe meine Antwort aktualisiert. – Stefan

2

die Sie interessieren (ich habe nicht jetzt eine Linux-Maschine zu testen):

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

Wenn der Dateiname vom Benutzer bereitgestellte ist, sollten Sie 012 vermeidenaus Sicherheitsgründen. Sie können versuchen:

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

Vom os module documentation:

Hinweis: Obwohl Windows chmod() unterstützt, können Sie nur die mit ihm der Datei gesetzt read-only-Flag (über die stat.S_IWRITE und stat .S_IREAD-Konstanten oder ein entsprechender Integer-Wert). Alle anderen Bits werden ignoriert.

Für Windows-Berechtigungen verwalten Sie die ACLs. Die Anpassung von another answer, müssen Sie die pywin32 Bibliothek:

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) 

Ändern der con.FILE_ALL_ACCESS Flagge zu denen, die Sie benötigen.

+0

Danke für Ihre Antwort. Ich habe immer noch keinen Erfolg mit den Schritten in dieser Antwort. Werde es morgen einen letzten Versuch geben. – Stefan

+0

Haben Sie die Zeichenfolge "Your Username" in Ihren tatsächlichen Benutzernamen geändert? –