仅从 Cron 运行 php 脚本或检查是否来自 cron 请求?

问题描述 投票:0回答:5

如何仅从 cron 运行 php 脚本,或者是否可以检查请求是否来自 cron?

编辑

我正在尝试使用参数调用 php 文件。但它们都不起作用:

php -q /home/domain/public_html/cronjob.php?i=a
php -q /home/domain/public_html/cronjob.php par1
php -q /home/domain/public_html/cronjob.php par1=a
php -q /home/domain/public_html/cronjob.php par1='a'

我无法使用 $_GET、$_SESSION 或 $argv。如何使用参数调用文件?

php security cron
5个回答
9
投票

如果您问这个问题是因为您需要检查脚本是否不是从网络请求调用,您可以使用

php_sapi_name
函数来查看调用方法 - 如果是 cron 作业,则该函数应该返回
cli
表示命令行调用。然而,它并不能帮助区分 cron 作业和常规命令行调用。

如果您还需要区分 cron 作业和脚本的命令行调用,您可以检查运行脚本的用户,看看它是否与运行 cron 作业的用户相同。例如,可以在 *nix 系统上使用

posix_getuid
posix_getlogin
函数来完成。

最后,如果您担心有人以 cron 作业所有者身份登录并从命令行运行脚本,您应该使用没有 shell 的单独用户来执行 cron 作业。


1
投票

您可以将一个参数传递给您的脚本,表明它是在 cron 作业中调用的。 看一下问题:cron-jobs-calling-a-php-script-with-variables


1
投票

如何将一些身份验证密钥传递给您的脚本,该密钥仅存储在 cron_script 和接收器脚本中。通话时检查 authkey 是否通过接收器脚本中的 $_GET['auth_key'] 传输。

喜欢:http://www.example.com/receiver_script.php?auth_key=“WhatEverYouWant”


1
投票

好吧,我找到了解决方案。如果你想使用 GET 参数调用 php 文件,你应该这样调用文件:

php -q /home/domain/public_html/cronjob.php name=value

您可以使用 $_GET 在 php 文件中获取此数据:

$_GET['name']

或argv:

$argv[1]

如果您想将参数传递给 argb :

php -q /home/domain/public_html/cronjob.php value

我在网站上找到的其他示例不起作用,但这些效果很好..


0
投票

您可以将客户端IP地址与服务器IP地址进行比较,也可以在CronJob地址中使用令牌,如下所示:

if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
    $ip = $_SERVER['HTTP_CLIENT_IP'];
} elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
} else {
    $ip = $_SERVER['REMOTE_ADDR'];
}

$token = 'YOUR_UNQUIE_TOKEN';
if($ip == $_SERVER['SERVER_ADDR'] && (isset($_GET['token']) && $_GET['token'] === $token)){
    // ---- your-cronJob-code----
}
© www.soinside.com 2019 - 2024. All rights reserved.