2013-10-12 4 views
0

cgi python 스크립트에서 표준 파이썬 os.system 호출을 실행하려고합니다. 이것은 자습서의 일부이므로 스크립트는 매우 간단합니다. 나는 라스베리 파이 카메라로 사진을 찍고 웹 페이지에 표시하려고합니다.웹 서버에서 시스템 호출 실행

import os, sys 

os.system('raspistill -o /var/www/images/image.jpg') 

print "Content-type:text/html\r\n\r\n" 
print '<html>' 
print '<head>' 
print '<title>Hello Word - First CGI Program</title>' 
print '</head>' 
print '<body>' 
print '<h2>Hello Word! This is my first CGI program</h2>' 
print '<img src="/var/www/images/image.jpg"/>' 
print '</body>' 
print '</html>' 

(브라우저에서 개방) 시스템 명령을 실행할 때 내가 오류는 다음과 같습니다
* "나는 이것에 대한 또 다른 질문을 보았다

을 인스턴스를 vchiq 열지 못했습니다 그리고 그것은 대해 뭔가를 말했다 http deamon을 잘못된 사용자로 실행하고 있지만 의미가 무엇인지 모르겠습니다. 표준 사용자로 실행하면 스크립트가 정상적으로 실행됩니다.

답변

0

대부분의 웹 서버는 웹 서버용으로 실행되지만 Apache2는 다음과 같이 실행됩니다. 예를 들어, www- 데이터 계산의 모든 파일 다른 사용자의 특정 작업을 허용 또는 금지하는 소유권 및 사용 권한 데이터가 있습니다. 예를 들어 수퍼 유저 (루트) 만 컴퓨터를 끄기 위해 poweroff 응용 프로그램을 실행할 수 있습니다.

실행하려고하는 실행 파일을 찾으려면 which raspistill을 실행하십시오. 실행 파일의 위치가 반환됩니다. 다음으로 ls -l `which raspistill`을 사용하여 파일 사용 권한을 확인하고 -rwxr-xr--으로 표시되는 소유자 데이터 및 파일 사용 권한을 확인해야합니다 (이는 일반적인 사용 권한 집합이므로 사용자에 따라 다를 수 있음). 첫 번째 3은 파일 소유자에 대한 읽기 - 쓰기 - 익명 권한을 나타내며 그 다음 3 개의 문자는 사용자 그룹에 대한 읽기 및 eXecute 권한 만 나타내며 마지막 3 개의 문자는 "다른"사용자에 대한 읽기 권한 만 나타냅니다.

파일 소유자가 www-data가 아닌 경우 내가 권장하지 않는 chown <user> <file>을 사용하여 파일 소유권 정보를 변경하거나 chmod o+x `which raspistill`으로 설정된 "다른"사용자에게 실행 권한을 추가하는 등 여러 가지 작업을 수행 할 수 있습니다 .

문제가 실제로 사용 권한과 관련된 경우 문제가 해결 될 것입니다.

추가 정보 :

http://www.computerhope.com/unix/uchmod.htm

http://www.ss64.com/bash/chmod.html

1

나는 그것을 해결했습니다.

웹 서버가 raspistill 명령에 액세스 할 수 있지만 해당 명령은 액세스 권한이없는 비디오 장치를 사용했습니다. 비디오와 오디오 그룹에 www 데이터 사용자를 추가하여 오디오를 재생하고 사진을 찍을 수있었습니다. 또한 웹 디렉토리의 일부 폴더에 대해 일부 그룹을 변경해야했습니다. 마지막으로 해결해야 할 사항은 os.system() 호출이 뭔가를 반환하고 브라우저에 웹 페이지 표시에 몇 가지 문제가 있음을들 수 있습니다. 텍스트 만 표시했습니다. 이제 하위 프로세스 모듈을 사용하고 초기 코드가 작동하는 것 같습니다. 간단한 테스트 코드는 다음과 같습니다.

import os, sys 

import subprocess 

#output = subprocess.check_output("raspistill -o /var/www/images/image.jpg",  shell=True) 
#os.system('raspistill -v -o /var/www/images/image.jpg') 

# Import modules for CGI handling 
import cgi, cgitb 

# Create instance of FieldStorage 
form = cgi.FieldStorage() 

output = "" 
output2 = "" 
# Get data from fields 
if form.getvalue('speak_en'): 
    output = subprocess.check_output("espeak \"%s\"" % (form.getvalue('speak')), shell=True) 

if form.getvalue('picture'): 
    output2 = subprocess.check_output("raspistill -o /var/www/images/image.jpg", shell=True) 


print """\ 
Content-type:text/html\n 
<html> 
<head> 
<title>Hello Word - First CGI Program</title> 
</head> 
<body> 
<h2>Select photo or speak</h2> 
<form action=\"/cgi-bin/hello.py\" method=\"post\"> 
<input type=\"checkbox\" name=\"speak_en\" value=\"on\" /> 
Speak: <input type=\"text\" name=\"speak\"><br /> 
Take picture: 
<input type=\"checkbox\" name=\"picture\" value=\"on\" /> 
<br /> 
<input type=\"submit\" value=\"Submit\" /> 
</form> 
<img src=\"../images/image.jpg\" width=640 height=480> 
<p>Speak output: %s</p> 
<p>Picture output: %s</p> 
</body> 
</html> 
""" % (output, output2) 
+0

동일한 문제가 있습니다. 비디오 그룹에 www 데이터 사용자를 추가하고 lighttpd를 다시 시작하면 문제가 해결되었습니다. – Snorfalorpagus

관련 문제