0

なぜかこれが不思議

echo system("echo 'echo hello > /dev/pts/2' | /usr/bin/at 19:36");

私のphpスクリプトからの作業を拒否しますが、コマンドラインから入力するだけでコマンドは正常に機能します。

PHPにはいくつかのコマンドを実行する権限があることを知っています。PHPスクリプトから「ls」を実行できますが、「at」コマンドは実行できません。ファイルのアクセス許可をいじってみましたが、これまでのところ役に立ちません:(

編集

/usr/bin/at のパーミッションは次のとおりです。

-rwxr-sr-x 1 daemon daemon 42752 Jan 15 2011 at

これはパーミッションの問題だと思います。ssh ターミナルから php ファイルを実行すると問題なく動作しますが、Web からは動作しません。

4

2 に答える 2

1

あなたが実行しているのは

echo 'hello' > /dev/pts/2 | /usr/bin/at 19:36

意味

echo 'hello' > /dev/pts/2

stdout を にパイプし/usr/bin/at 19:36ますが、すでにエコーを にリダイレクトしているため/dev/pts/2、これは空になります。おそらくあなたが意図したことは次のとおりです。

echo system("echo 'echo hello > /dev/pts/2' | /usr/bin/at 19:36");

shell_execシェルを介してコマンドを渡すために使用することもproc_open、実行しているコマンドの stdin/out/err をより適切に制御できるようにするために使用することもできます。あなたの例は(php.net docsからの適応例)に対応します:

<?php
$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 write to
);

$process = proc_open('/usr/bin/at', $descriptorspec, $pipes);

if (is_resource($process)) {
    fwrite($pipes[0], 'echo "hello" > /dev/pts/2');
    fclose($pipes[0]);

    $stdout = stream_get_contents($pipes[1]);
    fclose($pipes[1]);

    $stderr = stream_get_contents($pipes[2]);
    fclose($pipes[2]);

    $return_value = proc_close($process);
    echo "command returned $return_value. stdout: $stdout, stderr: $stderr\n";
} else {
    echo "Process failed";
}
?>
于 2012-05-22T19:52:11.633 に答える
0

php.ini ファイルで disable_functions をチェックして、セキュリティ上の理由から system などの機能が無効になっていることがあります。

于 2012-05-22T20:05:19.880 に答える