2017-02-21 3 views
2

Ich versuche, ein Python-Skript mit der Funktion exec() von PHP auszuführen.PHP exec (python.py), Berechtigung verweigert Schreiben von Datei

Die .php Seite über einen Browser geladen:

<?php 
echo exec("whoami"); 

echo(exec("/bin/python2.7 /var/www/cgi-bin/api/download.py")); 
?> 

Hier ist der Python-Skript:

# -*- encoding: UTF-8 -*- 

import os 
import httplib2 
import io 
import sys 
from httplib2 import Http 
from oauth2client import client 
from oauth2client import tools 
from apiclient import discovery 
from oauth2client.file import Storage 
from apiclient.discovery import build 
from oauth2client.client import OAuth2WebServerFlow 
from apiclient.http import MediaIoBaseDownload 
from oauth2client.service_account import ServiceAccountCredentials 

scopes = ['https://www.googleapis.com/auth/drive'] 

credentials = ServiceAccountCredentials.from_json_keyfile_name('/opt/scripts/full-patator-preprod.json', scopes) 

delegated_credentials = credentials.create_delegated('#############') 
http_auth = delegated_credentials.authorize(Http()) 

drive_service = build('drive', 'v2', http=http_auth) 


def get_file(service,fileId): 
    file = service.files().get(fileId=fileId).execute(http=http_auth); 
    return file 




item = get_file(drive_service,"#############") 

print(item.get('title')) 
delegated_credentials = credentials.create_delegated("#############") 
http_auth = delegated_credentials.authorize(Http()) 


request = drive_service.files().export_media(fileId="#############", mimeType='application/pdf') 

fh = io.FileIO("api/test.pdf","wb") 
downloader = MediaIoBaseDownload(fh, request) 
done = False 

counter=0; 
while done is False: 
    status, done = downloader.next_chunk() 
    print "Download %d%%." % int(status.progress() * 100) 
    counter+=1 
    if counter > 10: 
     done=True 
with open("test.pdf") as f: ## PDF File 
    print(type(f))   ## Open file is TextIOWrapper 
    bw=io.TextIOWrapper(fh) ## Conversion to TextIOWrapper 
    print(type(bw))   ## Just to confirm 

Alles funktioniert, wenn die .py oder die .php als Apache Benutzer ausführen. Aber mein Browser, wenn es Datei schreiben kommt:

fh = io.FileIO("api/test.pdf","wb") 

Ich habe diese Ausgabe in meinem Apache error_log:

Traceback (most recent call last): File "/var/www/cgi-bin/api/download.py", line 46, in fh = io.FileIO("test.pdf","wb") IOError: [Errno 13] Permission denied: 'test.pdf'

Nun, ich war ziemlich sicher, dass es auf die Genehmigung durch war von der Elternordner, dann die Erlaubnis des Elternteils des Elternteils. Aber ich habe eine 777 Berechtigung für diese Ordner eingerichtet und es hat nichts getan.

Mein PHP-Skript ist in /var/www/html/manager/execute.php Mein Py Skript in /var/www/cgi-bin/api/download.py ist

Ordner/www/,/cgi-bin /,/api/hat 777 Rechte.

Ich weiß, es ist keine gute Übung, aber ich möchte das Problem lösen, bevor Sie etwas sauberer machen.

Vielen Dank im Voraus

+0

Wenn Sie eine PHP-Datei über einen Browser aufrufen werden Sie der Benutzer 'www-data' sein. Und normalerweise hat 'www-data' nicht viele Rechte an der Kommandozeile. – JustOnUnderMillions

+0

Wem läuft das PHP Skript? Verfügt dieser Benutzer/diese Gruppe über Berechtigungen zum Ausführen des Python-Skripts? –

+0

Hallo, ich kann davon ausgehen, dass PHP als Apache-Benutzer ausgeführt wird, wenn ich Folgendes ausführen: shell_exec ("whoami"); es gibt mir "Apache" Und natürlich, Apache ist der Besitzer der .py-Datei –

Antwort

Verwandte Themen