将$ _GET参数传递给cron作业

Dfr*_*373 34 php linux cron get

我是新来的cron工作,我不确定这是否会奏效.

出于安全考虑,我考虑制作一个单页脚本来查找某些GET值(用户名,密码和安全代码),以确保只有计算机和知道所有3的人才能运行该命令.

我制作了脚本,它可以在浏览器中运行它,但是可以使用GET值运行cron作业吗?

一个例子就是我跑步

* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234
Run Code Online (Sandbox Code Playgroud)

这可能吗?

Rob*_*obB 84

$_GET[]$_POST[]当你的脚本通过Web服务器调用关联数组对象仅被初始化.通过命令行调用时,参数将在$argv数组中传递,就像C一样.

包含从命令行运行时传递给脚本的所有参数的数组.

你的命令是:

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234 
Run Code Online (Sandbox Code Playgroud)

然后,您将使用parse_str()来设置和访问参数:

<?php

var_dump($argv);

/*
array(4) {
  [0]=>
  string(27) "/path_to_script/cronjob.php"
  [1]=>
  string(13) "username=test"
  [2]=>
  string(13) "password=test"
  [3]=>
  string(9) "code=1234"
}
*/

parse_str($argv[3], $params);

echo $params['code']; // 1234
Run Code Online (Sandbox Code Playgroud)


jer*_*oen 10

不是你问题的直接答案,而是我认为更好的解决方案:

如果您希望除cron之外的其他人都运行该脚本,只需将其放在web-root之外.这样就无法通过网络服务器进行访问.

如果您确实需要以特殊用户身份运行该命令,请不要使用GET但具有用户登录并检查已登录的会话(某个设置的会话变量...)并仅在该页面中包含该脚本.

您可公开访问的脚本看起来像:

session_start();

if (isset($_SESSION['user']))
{
  include '/path/to/script/outside/of/web-root';
}
else
{
  die('No access.');
}
Run Code Online (Sandbox Code Playgroud)


gol*_*abs 10

我意识到这篇文章已经有好几年了,但这篇文章对我帮助最大,所以让我也分享我的发现,以帮助其他人。

我正在使用 DirectAdmin,并且我的 cron 示例都可以使用。我从“将所有 Cron 输出发送到电子邮件”中删除了我的电子邮件地址,这样我就不会收到有关我的 cronjobs 的电子邮件通知。

我从每 20 分钟运行一次的 cURL 请求开始:

*/20 * * * * /usr/local/bin/curl --silent 'https://demo.tld/app/stats/?update&key=1234'
Run Code Online (Sandbox Code Playgroud)

请注意URL两边的‘’,否则无法添加多个参数!

我使用该页面作为受 API 启发的方式来触发我从另一个网站收集的一些统计信息的更新,其他人可以从我的网站以 JSON 形式获取这些统计信息。参数“update”触发更新过程,参数“key”在验证后将触发额外的更新操作,我只想在 cronjob 请求更新时完成。

由于上面的 cronjob 基本上消耗了两个方向的带宽,我想使用基于 PHP 的 cronjob,但是遇到了参数问题......所以就在那时我发现了这篇文章,它拯救了我的一天:)

*/20 * * * * /usr/local/bin/php /home/path/to/public_html/app/stats/index.php update key=1234
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,文件名 (index.php) 现在包含在路径中,然后是参数(不带 ? 和 &)。

这样你就可以让 cronjob 工作了,但是你只完成了一半,因为参数不会通过$_GET…传递,当你用键检查来编写脚本时,这有点烦人$_GET

那么,它是如何运作的呢?很简单(至少经过一些研究),cronjob 通过名为 的变量将参数传递给脚本$argv

因此,有了这些知识,我寻找一种方法将其转换$argv$_GET

  1. 我可以手动或通过 cronjob 触发更新。
  2. 我不必重写整个脚本。

我找到了以下解决方案,我们只想在$argv实际设置时执行,因此我将其包装在if isset检查中:

if( isset( $argv ) )
{
    foreach( $argv as $arg ) {
        $e = explode( '=', $arg );
        if( count($e) == 2 )
            $_GET[$e[0]] = $e[1];
        else    
            $_GET[$e[0]] = 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

希望这也对你有帮助:)


小智 5

* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234
Run Code Online (Sandbox Code Playgroud)

这不行

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234
Run Code Online (Sandbox Code Playgroud)

这有效

此外,您需要使用parse_str()函数并获取值

$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz
Run Code Online (Sandbox Code Playgroud)