【问题标题】:PHP(Apache) doesn't execute BASH command (At + Wget)PHP(Apache) 不执行 BASH 命令 (At + Wget)
【发布时间】:2020-04-30 07:40:20
【问题描述】:

所以,伙计们,我有以下代码:

<?php
  $url  = "http://example.com/filetorun.php";
  $time = date('g:i A d.m.Y', $res['sometime']); 
  echo `echo "wget --spider {$url}" | at -M {$time}`;
?>

主要思想是在特定时间wget一些url,为我执行一些有用的操作。

终端会发生什么?

当我运行这个 bash 代码时。它给我这样的输出效果很好:

warning: commands will be executed using /bin/sh
job 59 at Mon Jan 13 17:12:00 2020

当我运行我的 php 脚本时 /var/log/apache2/error.log 会发生什么?

它得到这个输出。

atq 怎么样?

只有当我通过终端创建作业时,我才能在那里看到作业。当我从 php 脚本创建它时,我不能这样做。

我尝试过做什么?

我将用户添加到 /etc/at.allow 并从 /etc/at.deny 中删除他们

【问题讨论】:

  • 你为什么要echo 一个echo 然后输出一个wget 命令?你为什么不为此使用exec() (php.net/manual/de/function.exec.php)?
  • webserver 不应该执行脚本,越深入就会遇到越来越多的问题。根本不要掏空(到 wget 或到 at)(以不安全的方式,不少于):使用例如cron 和 php_curl 库直接从 PHP 发出请求:php.net/manual/en/curl.examples-basic.php
  • @thmspl:注意管道:这应该将命令发送到at,而不是直接执行。 linux.die.net/man/1/at
  • @thmspl 我也尝试通过 exec() 执行它,它给了我相同的结果:c
  • 这个问题真的是要解释 PHP/Apache 和您的终端帐户是不同的吗?

标签: php linux apache ubuntu at-job


【解决方案1】:

没有太多细节可以继续,但我将您的注意力引向at的这个要求:

at 调用时 SHELL 环境变量的值将决定使用哪个 shell 来执行 at 作业命令。如果调用 at 时未设置 SHELL,则将使用用户的登录 shell;否则,如果在调用 at 时设置了 SHELL,则它必须包含将用于在指定时间运行命令的 shell 解释器可执行文件的路径。

您的 Web 服务器用户是否定义了登录 shell? getent passwdgrep /etc/passwd 来确定。无论如何,我建议将 shell 设置为在命令本身中使用,以防止有人更改调用用户的默认 shell。

如果这不是问题,我们可能需要更多细节。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-04
    • 2013-11-20
    • 2015-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多