4

私はbashとPerlスクリプトのコレクションを持っています

  1. Linux ボックスへの展開に必要なディレクトリ構造を開発する
  2. (オプション) svn からコードをエクスポート
  3. このソースからパッケージをビルドする

これは端末からうまく機能しています。現在、クライアントはこのプロセスへの Web インターフェイスを要求しています。

たとえば、特定のページの [Create New Package] ボタンは、上記の手順を 1 つずつ呼び出し、スクリプト全体が実行されたときではなく、スクリプト エコーとして出力をユーザーに返します。

プログラム実行機能(システム、実行、パススルー...またはこのプロセスフローに適合するもの)を介してそれを呼び出したbashスクリプトからWebページまたはphpスクリプトに瞬時の出力を送信することは可能ですか?

なぜこれを行うのがエレガントですか?

そのようなことをしている間、どのようなセキュリティ対策を講じるべきですか (可能な場合)?

編集 いくつかの検索の後、ソリューションの一部を見つけましたが、まだ機能していません:

$cmd = 'cat ./password.txt|sudo  -S  ./setup.sh ';

$descriptorspec = array(
        0 => array("pipe", "r"),  // stdin is a pipe that the child will read from
        1 => array("pipe", "w"),  // stdout is a pipe that the child will write to
        2 => array("pipe", "w") // stderr is a pipe that the child will read from
);

flush();

$process = proc_open($cmd, $descriptorspec, $pipes, './', array());
echo "<pre>";
if (is_resource($process)) {    

    while ($s = fgets($pipes[1])) {
        print "Message:".$s;
        flush();
    }
    while ($s = fgets($pipes[2])) {
        print "Error:".$s;
        flush();
    }
}
echo "</pre>";

出力: (ウェブページ)

Error:WARNING: Improper use of the sudo command could lead to data loss
Error:or the deletion of important system files. Please double-check your
Error:typing when using sudo. Type "man sudo" for more information.
Error:
Error:To proceed, enter your password, or type Ctrl-C to abort.
Error:
Error:Password:
Error:Sorry, try again.
Error:Password:
Error:Sorry, try again.
Error:Password:
Error:Sorry, try again.
Error:sudo: 3 incorrect password attempts**

私が今抱えている最初の問題は、sudoパスワードを渡すことです

助けてください !

4

6 に答える 6

4

一種のマスター/スレーブ設計を使用します。スレーブは perl / bash スクリプトであり、ジョブ (パッケージ化、コンパイル、コードのエクスポートなど) を実行し、ログ エントリをフィードします。

マスターはあなたのphpプロセスになります。したがって、原則は次のとおりです。マスターとスレーブは通信チャネルを共有し、そのチャネルから非同期で通信します。

次のようなデータベースを想像できます。

create table tasks ( id INT primary key, status INT, argument VARCHAR(100));

PHP ページでユーザーの選択を切り替え、入力をフィルタリングする必要があります。

switch ($_GET['action']) {
   case 'export':
       $argument = sanitize($_GET['arg']);
       add_task('export', $argument);
       break;
   case '...': 
     // ...
}

add_task 関数は次のようになります。

function add_task($action, $arg)
{
   return $db->add('tasks', array($action, NEW_TASK, $arg);
}

スレーブはcron ジョブを介して実行され、データベースにクエリを実行して、タスクの進行状況をフィードします。

プロは次のとおりです。

  • 独立したシステム、進化を容易にします。
  • クライアントが切断されても、ジョブが失われることはありません
  • 確保しやすい

短所は次のとおりです。

  • 最初はもう少し複雑です。
  • 実行中のスレーブのポーリング時間が原因で、反応性が低下します (たとえば、5 分ごとに実行される場合)
  • コマンドの直接出力より少ない出力

メッセージ パッシング システムを使用するのではなく、xml-rpc のようなトリガーを実装してスレーブを実行できることに注意してください。

于 2012-06-14T12:27:44.030 に答える
1

Comet Web アプリケーション モデルを使用して、結果ページをリアルタイムで更新できます。

sudo の問題については、迅速かつ汚い解決策として、Web サーバーがパスワードなしで実行できる制限付きのコマンド セットを使用します。例 ( に追加/etc/sudoers):

apache ALL=(ALL) NOPASSWD: /sbin/service myproject *

これにより、apache を実行できるよう/sbin/service myproject stop/sbin/service myproject startなります。

Jenkinsを見てください。これは Web パーツを適切に処理します。ビルドにスクリプトを追加するだけで済みます。

より良い解決策は、 Aifで提案されているように、ロジックを分離することです。タスクを待機している 1 つのデーモン プロセスと、結果を視覚化する Web アプリケーション。

于 2012-06-15T00:47:33.780 に答える
1

最も簡単な方法は、目的に合わせてshell_execを使用することです。シェル経由でコマンドを実行し、完全な出力を文字列として返すため、Web サイトに表示できます。

コマンドが終了するのを待っている間に何らかの応答が必要なために、これが目的に合わない場合は、php で利用可能な他のプログラム実行関数を調べてください(ヒント: マニュアルページにいくつかの良いコメントがあります)。

この方法でコマンドライン スクリプトを呼び出す場合、生成された出力には、ファイルの所有者、グループ、および Web サーバーの権限 (pe wwwrun など) が含まれることに注意してください。展開の一部に個別の所有者、グループ、および/またはファイルのアクセス許可が必要な場合は、スクリプトで手動で設定するか、shell_exec ( chmod、php でこれを処理できます)chownを呼び出した後にそれらを手動で設定する必要があります。chgrp

セキュリティについて: Web ベースのアプリケーションの多くは、そのような機能を別のインストール ディレクトリに配置しているため、インストール後にこのディレクトリを削除するようお願いしています。削除しない限り、執拗に管理者に怒鳴っていた人もいたことを覚えています。これは、このスクリプトが間違ったときに間違った人によって呼び出されるのを防ぐ簡単な方法です。インストール後にアプリケーションが必要になる可能性がある場合は、許可されたユーザーのみがアクセスできる領域 (pe 管理領域など) に配置する必要があります。

于 2012-06-11T09:09:44.953 に答える
0

セキュリティのためにPHPを介してシステムコマンドを実行する場合は、常にescapeshellargescapeshellcmdを使用してください。また、chrootされたディレクトリ内のユーザーを可能な限り制限することをお勧めします。

于 2012-06-16T03:35:21.027 に答える
0

を使用して、stdoutとstdinをWebページに出力する問題を解決したようですproc_open。現在、問題はsudoを介してスクリプトを実行しているように見えます。

セキュリティの観点から、PHPアプリに(sudoを介して)rootとしてスクリプトを実行させると、私はうんざりします。password.txtにrootパスワードを設定することは、非常に大きなセキュリティホールです。

私が(可能であれば)行うことは、Apacheを実行しているunixユーザーがsetup.shを実行できるように、必要な変更を加えることです。(ApacheでPHPを実行していると仮定します。)setup.shをWebサーバーで実行する場合は、sudoを使用せずに実行できるはずです。

本当に別のユーザーとしてスクリプトを実行する必要がある場合は、非標準ユーザーとしてPHPスクリプトを実行するように設計されたsuPHPにチェックインすることができます。

于 2012-06-19T17:09:56.403 に答える