【问题标题】:How to run 'at' command via php system()如何通过 php system() 运行“at”命令
【发布时间】:2012-05-29 08:32:29
【问题描述】:

出于某种奇怪的原因

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

【问题讨论】:

标签: php unix


【解决方案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";
}
?>

【讨论】:

  • 嗯...我希望它工作,但它仍然没有:(。我认为这是一个权限问题,如果我从我的 ssh 终端执行 php 文件它工作正常,但不是从网络。
  • 你的原始代码会立即写hello,完全忽略at
  • 好的,这样就解决了一个问题:),但目前php甚至不会触及at命令:(
  • 权限设置,也可以看看manpage,在/etc/at.allow/etc/at.deny中可以控制哪些用户可以使用at
  • www-data 在 /etc/at.deny 文件中。我已将其从那里删除并将其添加到 at.allow 文件中,但是!它仍然不起作用:(
【解决方案2】:

在您的 php.ini 文件中检查 disable_functions 有时出于安全原因禁用系统等功能。

【讨论】:

  • system() 函数工作正常,因为我可以执行其他命令,例如 'ls' 命令
  • 您是否将 php 作为 SuPHP、FastCGI 等运行...?
  • FastCGI 与 Nginx 网络服务器对话
  • 很可能与执行 PHP 文件的用户有关。抱歉,我对 Nginx 不熟悉,尽管可能记录了某种类型的错误,但我会检查您的日志文件。
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2021-05-13
  • 1970-01-01
  • 2011-11-10
  • 1970-01-01
  • 1970-01-01
  • 2020-08-14
相关资源
最近更新 更多