2

現在、私の page.php ファイルは次のようになっています。

    <?php

    $cmd = './foo < input.txt > output.txt';

    $result = shell_exec($cmd);

    echo system('date'); //just to see change when refreshing the page

    ?>

シェルで同じコマンドを入力すると、いつでも完全に機能します (input.txt ファイルに入力例が用意されています)。

私の考えは、php を使用して input.txt ファイルと通信し、output.txt ファイルと通信してページに結果を返すインターフェイスを作成することでした。しかし、まず、持っているプログラムを実行できることを確認する必要があります。

でコンパイルしました

    gcc -Wall -o foo foo.c

foo 実行可能ファイルは、page.php と同じディレクトリにあります。

すべてのファイル(page.php、input.txt、およびfoo)で777のアクセス許可を試しました

サイトは稼働中で、ページを更新すると日付が変わりますが、ディレクトリに output.txt がありません。

私はもう試した

    $cmd = 'ls -la';

    $result = shell_exec($cmd);

    echo $result;

意図したとおりに機能し、適切なディレクトリの内容を表示します。

4

3 に答える 3

1

この種の問題を引き起こす原因の 1 つは、Apache がoutput.txt が置かれるディレクトリへの書き込みアクセス権を持っていない場合です。ls -l ../を実行して、必要な権限が実際にあるかどうかを確認してください。また、何が起こっているかについてのより多くのアイデアを与えるかもしれないので、結果をエコーアウトします.

于 2012-01-16T02:45:05.620 に答える
0

コメントで述べたように、問題は許可に基づいていました。これが機能するために必要な最小限の権限は次のとおりです。

「実行可能ファイルでは 711、入力ファイルでは 644、出力ファイルでは 666、格納フォルダーでは 755。」

すべての貢献に感謝します。

于 2015-05-20T09:22:54.677 に答える
0

もう 1 つの考えられる問題は、SELinux を有効にしている場合 (Fedora と Red Hat のデフォルトのように)、Apache のコンテキストであるとマークされていないコマンドの実行を Apache がブロックすることです。これは、誰かが Web サーバーまたは Web アプリケーションをハッキングした場合に、それを使用してサーバー上で任意のコマンドを実行できないようにするためのセキュリティ機能です。

アプリケーションの正しいコンテキストを設定するには、コマンドを実行する必要がありますchcon -t httpd_sys_script_exec_t execname(execname は実行可能ファイルの名前に置き換えられます)。また、入力ファイルと出力ファイルのコンテキストを変更して、chcon を介して Apache スクリプトで書き込めるようにする必要もあります。httpd_sys_script_ro_t読み取り専用の入力ファイルには type を使用httpd_sys_script_rw_tし、読み取り/書き込みの出力ファイルには typehttpd_sys_script_ra_tを使用するか、読み取り/追加の出力ファイルには type を使用する必要があります。ただし、通常、chcon コマンドは次のサーバーの再起動までしか変更しません。ファイル コンテキストはその時点でのディレクトリに基づいて再マップされるため、長期的には、ポリシーを調整して、それらのコンテキストをそれらのファイルの既定のコンテキストとして設定する必要があります。ただし、頭のてっぺんからそれを行う方法を覚えていないので、調べる必要があります。

于 2012-01-16T02:59:57.417 に答える