2014-07-14 1 views
3

저는 라즈베리 파이와 함께 작업 중이며 gpio 출력을 제어하는 ​​웹 페이지를 만드는 cgi 파이썬 스크립트를 작성하고 있습니다. RPi.GPIO를 GPIO로 가져 오려고하면 스크립트가 다운됩니다. 내 아파치 서버에서 URL에서 실행하고 때 나는이 액세스 할 수없는 것을 말한다/dev/mem 액세스가 라즈베리 파이에 대해 거부되었습니다

File "./coffee.py", line 7, in <module> 
    import RPi.GPIO as GPIO 
RuntimeError: No access to /dev/mem. Try running as root! 

내 코드 내 스크립트를 실행 sudo를 사용할 때 완벽하게 작동하지만,이 내가 점점 오전 오류입니다/dev/mem. 이미 편집 visudo 시도하고 그 작동하지 않았다. 나는 URL 호출에서 루트로 내 스크립트를 실행할 수 있습니다

#includedir /etc/sudoers.d 
pi ALL=(ALL) NOPASSWD: ALL 
www-data ALL=(root) NOPASSWD: /usr/bin/python3 /usr/lib/cgi-bin/coffee.py * 
apache2 ALL = (root) NOPASSWD: /usr/lib/cgi-bin/coffee.py 

가 어떤 식 으로든이 내 visudo를 파일처럼 보이는 무엇인가? 아무도 내가 뭘 잘못하고 있다고 말할 수 있습니까?

답변

0

문제는 스크립트가 루트로 실행되지 않는다는 것입니다. 아파치가 실행되는 사용자로 실행됩니다.

아파치 프로세스가 특정 사용자 (아마도 www-data)로 실행됩니다. 아파치가 실행되는 사용자를 변경할 수 있습니다. 당신은 /etc/apache2/envvars이를 찾을 수 있어야합니다 :

# Since there is no sane way to get the parsed apache2 config in scripts, some 
# settings are defined via environment variables and then used in apache2ctl, 
# /etc/init.d/apache2, /etc/logrotate.d/apache2, etc. 
export APACHE_RUN_USER=www-data 
export APACHE_RUN_GROUP=www-data 

당신이 root로가 액세스 권한을 가질 것을 변경하는 경우. 일반적으로 이것은 끔찍한 보안 구멍이 될 수 있지만 이미 직접 메모리 액세스를하고 있습니다. 정말 조심하세요!

당신이 이걸로 불편하다면 update your command so it is executed as root이 필요합니다 (이것은 좋은 방법이지만, 당신이하고있는 것을 이해해야합니다!). 호출 방법을 변경하거나 사용자를 변경하는 스크립트에서 호출을 감싸거나 setuid을 사용하여이 작업을 수행 할 수 있습니다 (이는 앞서 언급 한 suEXEC 접근 방식과 매우 유사합니다). 스크립트에서 감싸는 것이 가장 좋은 방법 인 것 같습니다. sudoers에 해당 명령에 대한 권한을 올바르게 적용해야하며 setuid 접근법의 모든 함의를 이해하지 않아도됩니다.