有没有办法只从cron作业调用脚本并使其成为其他ips无法运行该脚本?
我有一个向手机发送通知的脚本。它应该被一天的cron作业调用,但有时会触发它,每个人都应该得到通知。我想限制它只能从我的服务器调用。
换句话说,不能从浏览器或蜘蛛等中调用它。
由于
答案 0 :(得分:4)
我建议您不要公开提供此文件。
但要直接回答你的问题;一种方法是添加以下检查:
if (php_sapi_name() === 'cli') {...}
更多信息:https://secure.php.net/manual/en/function.php-sapi-name.php
答案 1 :(得分:2)
您的脚本似乎可以通过公共网址获得。把它移到其他地方。例如,如果脚本位于/www/site.com/public/script.php
内,并且/www/site.com/public
是Web服务器的公共目录,请将其移至某个/www/site.com/cron/script.php
。确保未将Web服务器配置为从cron
目录中获取文件。
答案 2 :(得分:1)
正如其他人所写的那样,可能还有其他可以使用的设置(权限和文件位置)但是,我从来没有告诉某人重新设计整个过程以满足单一需求的人。这感觉太像尾巴摇着狗。因此,如果您希望脚本只能由您的cron作业执行而不是被其他进程错误地执行,我会为您提供此解决方案
已经注意到php_sapi解决方案提供了不一致的行为,并且是特定于系统配置的(例如,在从命令行调用脚本时回显它的输出,并且在从cron调用时再次输出)。这可以导致追踪其他错误。我见过和使用的最佳解决方案是将命令行参数传递给您的脚本并评估该参数的存在。
你的cron工作看起来像是:
* * * * * * php /path/to/script --cron
然后,在脚本内部执行if检查,如果不满意,则停止脚本。
if( $argv[0] != 'cron')
{
//NO CRON ARGUMENT SUPPLIED, SOMETHING ELSE MUST BE CALLING THIS
exit;
}
请注意,某些系统可能会使用第一个参数作为脚本名称,因此根据您的个人系统配置,您可能需要检查$argv[1]
希望这有帮助,如果您有任何问题,请与我们联系。如果需要,我很乐意回复或修改。