2017-02-21 40 views
2

Я пытаюсь выполнить скрипт 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.

Я знаю, что это не очень хорошая практика, но я бы хотел решить проблему, прежде чем делать что-то более чистым.

Заранее спасибо

+0

При вызове PHP-файл злоумышленником браузера будет пользователь 'WWW-data'. И нормальный 'www-data' имеет/не должен иметь больших прав в командной строке. – JustOnUnderMillions

+0

Кто выполняет скрипт PHP? Имеет ли этот пользователь/группу разрешения для запуска скрипта Python? –

+0

Здравствуйте, я могу предположить, что php работает как пользователь apache, потому что когда я выполняю: shell_exec («whoami»); он возвращает меня «apache» И, конечно же, apache является владельцем .py-файла –

ответ

 Смежные вопросы

  • Нет связанных вопросов^_^