2011-04-26 30 views
0

樣品的PHP腳本是這樣的:PHP運行bash(.sh)腳本。 dpkg的--info作品,但沒有dpkg -i來

#!/usr/bin/php 
    $file = '/private/var/www/app/install.sh'; 
    if(is_file($file)){ 
     $output = shell_exec('bash /private/var/www/app/install.sh'); 
     fwrite(STDOUT, $output."\n"); 
    } 
    exit(0); 

install.sh例

#!/bin/bash 
clear 
echo "Executing Install Script..." 
dpkg --info /private/var/www/app/app.deb 
dpkg -i /private/var/www/app/app.deb 
echo "Script Finished" 
exit 0 

這將打印出的dpkg導致數據--info,但它不會運行dpkg -i。它不打印任何錯誤,或任何東西...

此外,這是通過網絡瀏覽器執行。當腳本從終端運行時,它工作正常。但在網絡上,只有info命令被返回。

+1

需要注意的是隻看到標準輸出。要看stderr,你需要重定向'shell_exec('bash /private/var/www/app/install.sh 2> &1');' – jsw 2011-04-26 07:42:41

回答

1

在這裏你可能會遇到一些安全問題,我不打算評論這些。不過,我猜想dpkg -i需要以root身份運行,並且您的web服務器(它執行install.sh腳本)不以root身份運行。另一方面,dpkg --info命令不需要root權限來運行,因此您將在通過Web服務器的用戶執行時看到它的輸出。如果您確實需要以root身份運行此腳本,則可能需要查看特定的/etc/sudoers配置。或許,從這裏開始:https://help.ubuntu.com/community/Sudoers

這裏看看:http://ubuntuforums.org/showthread.php?t=1132821

+0

Hola。我試着加入 「%wheel ALL =(ALL)NOPASSWD:/ usr/bin/dpkg %ALL ALL =(ALL)NOPASSWD:/ usr/bin/dpkg所有=(全部)NOPASSWD:/ usr/bin/dpkg 「 不是所有的一次,但那些組合運行它,當我從install.sh運行ID命令我得到這個。也即時使用Lighttpd不是阿帕奇 'uid = 0(root)gid = 0(輪)組= 0(輪)」 – 2011-04-26 05:26:59

+0

嗨,你需要在/ etc/sudoers文件條目正是你會被執行命令的方式相匹配。你已經寫你的問題的方式看起來像你想要sudo執行install.sh(反過來,它會執行dpkg ...)。您可以在安裝腳本的頂部放置'#!/ usr/bin/env bash'。然後在sudoers文件中使用/path/to/install.sh。類似:'WEBSRV_USER ALL =(根)NOPASSWD:/ P /到/ install.sh'。然後'了shell_exec(「須藤/p/to/install.sh」)'看一看我的回答上述有關詳細信息,第二個鏈接。另外,請仔細閱讀有關使用此方法的安全問題 – jsw 2011-04-26 07:20:41

+0

首先非常感謝!我也跟着你的建議,並添加#!的/ usr/bin中/ env的慶典,以我的安裝腳本,並使用visudo命令正確地添加新的規則腳本文件。然後使用shell_exec('sudo path/install.sh')腳本運行並且安裝了東西!站起來的工作,先生:) – 2011-04-26 08:42:11

0

dpkg --info不需要root權限,而dpkg -i一樣。由於您在瀏覽器上運行腳本,這意味着您的腳本在php/apache的用戶上運行。我相信,在大多數安裝中,該用戶沒有root權限。

爲了克服這個問題,你可以建立某種形式的處理器,將有以下步驟:

創建queue

  • queue_id
  • 時間戳
  • deb_file
  • is_processed

瀏覽器腳本

  • 後點擊安裝,插入排隊表中的條目。

處理器腳本(比方說queue_processor.php

  • 在運行,檢查是否有隊列表,其條目is_processed = 0
  • 如果有任何:
    • 更新is_processed = 1個
    • 說完後文件
    • 過程編處理(安裝DEB文件),設置is_processed = 2

的最後一步是,以設置的crontab queue_processor.php和具有它的所有者爲根:

* * * * * root /path/to/php/binary/php /path/to/your/queue_processor.php