2011-08-02 62 views
11

我在本地主機上運行Apache。從一個以www用戶身份運行的PHP腳本中,我想在我的機器上控制Rhythmbox播放。到目前爲止,我在我的PHP腳本有一個簡單的命令:以特定用戶身份從PHP運行命令行應用程序

exec('rhythmbox-client --pause');

,當我在命令行中我跑它這個偉大的工程,但如果它運行作爲WWW的用戶我想rhythmbox-client不知道/不能訪問我的Rhythmbox實例。

是否有一個簡單的方法讓PHP腳本以我的用戶而不是www用戶身份運行,或告訴rhythmbox-client哪個實例要控制?

整體應用是當我的手機摘機時,它會調用我的PHP腳本暫停音樂,並在手機掛機時恢復播放。我愛VoIP電話!

解決方案: 感謝Carpetsmoker和塔裏克我以前sudo的答案,但有幾個問題。爲了克服它們,我做了以下操作:

創建了一個bash腳本來呼叫rhythmbox-client。這個bash腳本是在PHP中使用sudo執行的,如下面的答案中所述。不幸的是rhythmbox-client不知道該管什麼環境,所以bash腳本是這樣的:

#! /bin/bash 
DBUS_ADDRESS=`grep -z DBUS_SESSION_BUS_ADDRESS /proc/*/environ 2> /dev/null| sed 's/DBUS/\nDBUS/g' | tail -n 1` 
if [ "x$DBUS_ADDRESS" != "x" ]; then 
     export $DBUS_ADDRESS 
     /usr/bin/rhythmbox-client --pause 
fi 

現在,bash腳本可以通過PHP和wwwuser執行,我的手機可以暫停/播放我的音樂!

+1

如何嘗試運行rhythmbox-client不作爲根? – genesis

+0

你打算只在本地運行你的服務器嗎? (又名從未把它在線) – afuzzyllama

+0

@afuzzyllama是的,它只是在本地 – Tak

回答

16

一種解決方案是使用sudo(8)

exec('sudo -u myuser ls /'); 

你會很明顯,需要設置sudo(8)允許用戶在運行您的Web服務器來調用它。編輯sudoers文件與visudo(8)文件,你可以使用類似:

wwwuser ALL=/usr/bin/rhythmbox-client 

爲了防止Apache能夠運行其他命令和的rythymbox命令。

+0

嗨感謝您的答案。我用'visudo'編輯'/ etc/sudoers',但是當我執行'sudo -u myuser rhythmbox-client -pause'時,系統提示輸入wwwuser密碼。有沒有辦法避免這個實例的密碼驗證? – Tak

+0

更改爲'wwwuser ALL = NOPASSWD:/ usr/bin/rhythmbox-client' –

+0

謝謝我將它改爲了'wwwuser ALL =(ALL)NOPASSWD:/ usr/bin/rhythmbox-client'。如果我像wwwuser一樣從命令行運行它,但它的工作效果很好,但是當我通過Apache調用時,我的PHP腳本不會運行它: – Tak

0

如果一個進程可以由任何用戶運行,它可以由PHP運行。例子是fortune命令

-rwxr-xr-x 1 root root 18816 Oct 1 2009 /usr/games/fortune 

看爲每個用戶的x權限。但是這有時並不奏效,你可能不得不讓用戶運行該程序,例如www-dataapache等。您可以sudo www-data並嘗試運行該命令。如果它能正常工作,Apache/PHP應該能夠運行它。

0

在我的情況下,該解決方案就這樣說:

1)增加了該行sudoers文件:

myuser ALL=(ALL) NOPASSWD: /usr/bin/prlctl 
_www ALL=(ALL) NOPASSWD: /usr/bin/prlctl  # IMPORTANT!!! 

2)在PHP中的EXEC()命令改爲:

exec("sudo -u myuser prlctl list -a", $out, $r); 

非常感謝您的幫助!

Victor Espina

相關問題