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
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
Wem läuft das PHP Skript? Verfügt dieser Benutzer/diese Gruppe über Berechtigungen zum Ausführen des Python-Skripts? –
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 –