0

サンプル PHP スクリプトは次のようになります。

#!/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 は実行されません。エラーも何も出力されません...

また、これは Web Web ブラウザーを介して実行されています。ターミナルからスクリプトを実行すると、正常に動作します。ただし、Web では info コマンドのみが返されます。

4

2 に答える 2

1

あなたがここでやろうとしていることにはおそらくいくつかのセキュリティ上の懸念があるので、私はそれらについてコメントするつもりはありません. dpkg -iただし、 root として実行する必要があり、(install.sh スクリプトを実行する) Web サーバーは root として実行されていないと思います。一方、dpkg --infoコマンドを実行するために root 権限は必要ないため、Web サーバーのユーザーを介して実行すると、その出力が表示されます。このスクリプトをルートとして実行する必要がある場合は、特定の構成を確認することをお勧めします/etc/sudoers。おそらくここから始めてください:https://help.ubuntu.com/community/Sudoers

ここを見てください:http://ubuntuforums.org/showthread.php?t=1132821

于 2011-04-26T02:23:07.243 に答える
0

dpkg --infoルート権限は必要ありませんが、必要ですdpkg -i。ブラウザでスクリプトを実行するので、これは、スクリプトが php / apache のユーザーで実行されることを意味します。ほとんどのインストールでは、そのユーザーにはルート権限がないと思います。

これを克服するために、次のステップを持つある種のプロセッサを作成できます。

queueテーブルを作成します:

  • queue_id
  • タイムスタンプ
  • deb_file
  • is_processed

ブラウザスクリプト:

  • インストールをクリックすると、キュー テーブルにエントリが挿入されます。

プロセッサ スクリプト (としましょうqueue_processor.php) :

  • 実行時に、キュー テーブルに is_processed = 0 のエントリがあるかどうかを確認します
  • ある場合:
    • 更新 is_processed = 1
    • そのファイルを処理する
    • 処理 (deb ファイルのインストール) が終了したら、is_processed = 2 を設定します。

最後のステップは、queue_processor.phpcrontab を設定し、所有者を root にすることです。

*   *   *   *   *   root   /path/to/php/binary/php /path/to/your/queue_processor.php
于 2011-04-26T02:38:50.693 に答える