1

いくつかの引数を指定して remove サーバーのシェルから php プロセスを開始する必要があるため、ユーザーが GET リクエストを実行したときに何らかの関数を実行する REST API を作成するのは良い考えだと思いました。

テスト用に簡単な bash スクリプトを作成しましたが、このスクリプトを Web サイトから呼び出すときに、コマンドライン引数が指定されていないことがわかりました。

shell_exec('/var/www/test.sh 123')

Bash スクリプト ソース:

#!/bin/sh
echo $1;

root (または他の既存のユーザー) からこの bash スクリプトを呼び出すと、受け取った引数が正しく表示されます。このスクリプトを Web サイト (ユーザー www-data で apache2 の下で実行されている) から呼び出すと、何も返されません。

また、コンソールで www-data ユーザーの下でこの bash スクリプトを実行しても、何も返されません。

su -c '/var/www/test.sh 123' www-data

また、php とは別のユーザーからプロセスを開始しようとしました (これはセキュリティ上の理由から機能しないと想定されていますが、念のため):

$result = system("su -c '/var/www/test.sh 123' sexyuser", $data);
// var_dump($result): string(0) ""
// var_dump($data): int(1)

では、php の下でプロセスを実行するには、www-data ユーザーにどのような権限を与える必要がありますか?

4

1 に答える 1

1

PHPにスクリプトを実行させ、結果を処理させる必要があります

たとえば、http: //www.php.net/manual/en/function.exec.php などの exec で php.net を確認します。

//called by example.com/myshell.php?day=today&k=y&whatever=youwant
$arguments = implode(" ", $_GET);
$lastline_of_exec_result = exec ( "/your/command.sh ".$arguments); //sh called with today y youwant
echo $lastline_of_exec;

$arguments は、スクリプトが GET 引数から取得したすべての情報の文字列化されたリストです

鉱石を正確に出力したい場合は、これを試してください:

//called by example.com/myshell.php?day=today&k=y&whatever=youwant
$argument = $_GET['whatever'];
$output = array();
$last_line = exec("your/command.sh ".$argument, &$output); //sh called with youwant
foreach($output as $line)
    echo $line."<br/>".PHP_EOL;

またはもちろん(shell_execを使用)

$argument = $_GET['whatever'];
$output = shell_exec("your/command.sh ".$argument);
echo "<pre>".$output."</pre>";

php.ini(shell_)execの下にリストされていないことを確認してくださいdisable_functions

于 2013-02-09T12:39:52.590 に答える