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 文件,它工作正常,但不是从网络。

4

2 回答 2

1

你正在执行的是

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

意义

echo 'hello' > /dev/pts/2

并将标准输出管道传输到,/usr/bin/at 19:36但由于您已经将回声重定向到/dev/pts/2,这将是空的。你可能打算做的是:

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

您可能还想使用shell_exec通过 shell 传递命令,或者proc_open让您更好地控制正在执行的命令的 stdin/out/err。您的示例将对应于(改编自 php.net 文档的示例):

<?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 有时出于安全原因禁用诸如系统之类的功能。

于 2012-05-22T20:05:19.880 回答