2014-07-14 4 views
3

Je travaille avec mon Raspberry Pi et j'écris un script cgi python qui crée une page web pour contrôler mes broches gpio out. Mon script se bloque lorsque j'essaie d'importer RPi.GPIO en tant que GPIO. C'est l'erreur que je reçois:/dev/mem accès refusé sur framboise pi

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

Mon code fonctionne parfaitement lorsque j'utilise sudo pour exécuter mon script, mais quand je suis en cours d'exécution à partir d'une URL de mon serveur apache2 il dit que je n'ai pas accès à/dev/mem. J'ai déjà essayé d'éditer visudo et ça n'a pas marché. C'est ce que mon fichier visudo ressemble:

#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 

Il possible que je peux exécuter mon script en tant que root à partir d'un appel d'URL? Quelqu'un peut-il me dire ce que je fais mal?

Répondre

0

Votre problème est que le script n'est pas exécuté en tant que root. Il est exécuté en tant qu'utilisateur exécuté par Apache.

Votre processus Apache s'exécute en tant qu'utilisateur spécifique, probablement www-data. Vous pouvez changer l'utilisateur sur lequel Apache fonctionne. Vous devriez pouvoir trouver dans /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 

Si vous changez que pour root vous devriez avoir accès. Normalement, ce serait un trou de sécurité terrible, mais vous faites déjà un accès direct à la mémoire. Soyez très prudent!

Si vous êtes mal à l'aise avec cela, alors vous devez update your command so it is executed as root (c'est un bon moyen, mais cela nécessite que vous compreniez ce que vous faites!). Vous pouvez le faire en modifiant la façon dont vous l'appelez, ou en enveloppant l'appel dans un script qui lui-même change l'utilisateur, ou en utilisant setuid (ceci est très similaire à l'approche suEXEC mentionnée plus haut). L'emballer dans un script me semble le meilleur moyen, car cela devrait permettre à votre entrée dans sudoers d'appliquer correctement les privilèges pour cette seule commande, et cela ne nécessite pas que vous compreniez toutes les implications des approches setuid.