2012-03-13 76 views
2

我正在使用opencv在我的arch linux上啓動攝像頭。當我從服務器本身的命令行實際執行時,它已經啓動並運行良好。 我想用php初始化它。我嘗試使用來自PHP的shell_exec使用php shell_exec()在服務器上啓動攝像頭執行命令行

我的PHP文件看起來像:

<?php 
$output=shell_exec('LD_LIBRARY_PATH=usr/local/lib ./a.out 0 2>&1 1>/dev/null'); 
echo $output; 
?> 

它給出了這樣的輸出: ERROR: capture is NULL

我通過我的窗戶Web瀏覽器作爲客戶端和OpenCV的和相關的文件運行此都在服務器是我的拱門Linux。

我想從Windows網絡瀏覽器運行這個php文件時啓動攝像頭並捕獲圖像,但執行時會引發上述錯誤。

+0

您將所有輸出重定向到/ dev/null,因此不會返回任何內容。 – 2012-03-13 16:21:33

+0

好的......現在我刪除了/ dev/null部分......錯誤消失了.... bt照相機還沒有開始在服務器(arch)上...... – 2012-03-13 16:24:48

+0

Web服務器用戶是否擁有執行該文件的權限? – 2012-03-13 16:43:59

回答

0

雖然這可能工作時,你被SSH進入你的服務器。網絡服務器用戶很可能與您登錄的用戶不同。 Web服務器在Linux機器上運行的常用用戶ID /組是http,www-data,nobody和其他。

從這一點你有兩個選擇。

  1. 您可以確保你正試圖從PHP運行腳本(和它的所有孩子,如果有的話)能夠通過服務器用戶運行。

  2. 您可以修改您的/ etc/sudoers文件,該文件僅允許web服務器用戶訪問該文件以提升該腳本的權限。 (注意:這可能會打開安全漏洞,所以要小心)。

要找出你的服務器上運行哪些用戶爲執行此:ps aux 以輸出列表看看輸出的第一列,這一進程在運行的用戶。這裏有我的箱子一個我的網絡服務器(Nginx的)的摘錄:

www-data 26852 0.0 0.0 29768 3840 ? S Jun04 0:50 nginx: worker process

你可以看到nginx的與用戶WWW的數據在這裏運行。您也可以使用grep執行該命令,以幫助您更快地找到過程。 Grep只會顯示與您發送的內容相匹配的行。這裏有一個例子:ps aux | grep nginx

好了,現在你知道web服務器運行的是什麼用戶,讓我們試着讓該用戶訪問腳本。假設您的腳本是foo,位於/usr/local/bin。你會做以下命令:

chown www-data /usr/local/bin/foo

上的文件更改所有權後嘗試從PHP頁面重新運行你的命令,看看它是否工作。

爲了完整起見,我還說過你可以給你的網絡服務器用戶sudo權限。要做到這一點,你需要下面的行添加到您的/etc/sudoers文件的底部:

www-data ALL= NOPASSWD: /usr/local/bin/foo

然後你了shell_exec命令可以切換到這一點:

shell_exec('sudo /usr/local/bin/foo');

請記住這樣做會讓你的網絡服務器用戶運行腳本root這是在各種情況下非常危險。但是,相機可能需要提升權限才能工作。我不確定您要調用的相機設置的權限要求是什麼。

祝你好運。希望這可以幫助!

相關問題