2014-07-14 88 views
3

我正在使用我的Raspberry Pi,並且正在編寫一個cgi python腳本,該腳本創建一個網頁來控制我的gpio輸出管腳。當我嘗試將RPi.GPIO作爲GPIO導入時,我的腳本崩潰。這是我得到的錯誤:/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來運行我的腳本,但是當我從我的Apache2服務器的URL運行它說我沒有訪問的/ dev/MEM。我已經嘗試編輯visudo,並沒有工作。這是我的visudo文件的樣子:

#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 

有沒有什麼辦法可以通過URL調用以root身份運行我的腳本?誰能告訴我我做錯了什麼?

回答

0

你的問題是腳本沒有作爲root執行。它以apache運行的用戶身份執行。

您的apache進程作爲特定用戶運行,可能是www-data。你可以改變Apache運行的用戶。你應該能夠找到這/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方法的全部含義。