Я пытаюсь выполнить скрипт python с помощью функции exec() PHP.PHP exec (python.py), разрешен ли файл записи
.php страница загружается через браузер:
<?php
echo exec("whoami");
echo(exec("/bin/python2.7 /var/www/cgi-bin/api/download.py"));
?>
Вот питон скрипт:
# -*- 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
Все работает, если выполнить .py или .php как пользователь Apache. Но с помощью моего браузера, когда речь идет о записи в файл:
fh = io.FileIO("api/test.pdf","wb")
У меня есть этот выход в моем апача 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'
Ну, я был уверен, что это было связано с разрешения родительскую папку, затем разрешение родителя родителя. Но я установил разрешение 777 для этих папок, и он ничего не сделал.
Мой PHP скрипт в /var/www/html/manager/execute.php Мой .py скрипт в /var/www/cgi-bin/api/download.py
папки/WWW/,/cgi-bin /,/api/имеет права 777.
Я знаю, что это не очень хорошая практика, но я бы хотел решить проблему, прежде чем делать что-то более чистым.
Заранее спасибо
При вызове PHP-файл злоумышленником браузера будет пользователь 'WWW-data'. И нормальный 'www-data' имеет/не должен иметь больших прав в командной строке. – JustOnUnderMillions
Кто выполняет скрипт PHP? Имеет ли этот пользователь/группу разрешения для запуска скрипта Python? –
Здравствуйте, я могу предположить, что php работает как пользователь apache, потому что когда я выполняю: shell_exec («whoami»); он возвращает меня «apache» И, конечно же, apache является владельцем .py-файла –