Übergeben von $_GET-Parametern an den Cron-Job

Lesezeit: 5 Minuten

Benutzer-Avatar
Dfranc3373

Ich bin neu bei Cron-Jobs und bin mir nicht sicher, ob dies funktionieren würde.

Aus Sicherheitsgründen habe ich darüber nachgedacht, ein einseitiges Skript zu erstellen, das nach bestimmten GET-Werten sucht (ein Benutzername, ein Passwort und ein Sicherheitscode), um sicherzustellen, dass nur der Computer und jemand, der alle 3 kennt, den Befehl ausführen kann.

Ich habe das Skript erstellt und es funktioniert, wenn es in einem Browser ausgeführt wird, aber ist es möglich, den Cron-Job mit GET-Werten auszuführen?

Ein Beispiel wäre ich laufen

* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234

Ist das möglich?

Benutzer-Avatar
Robert

Das $_GET[] & $_POST[] Assoziative Arrays werden nur initialisiert, wenn Ihr Skript über einen Webserver aufgerufen wird. Beim Aufruf über die Kommandozeile werden Parameter in der übergeben $argv Array, genau wie C.

Enthält ein Array aller Argumente, die an das Skript übergeben werden, wenn es über die Befehlszeile ausgeführt wird.

Ihr Befehl wäre:

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234 

Sie würden dann verwenden parse_str() zum Einstellen und Aufrufen der Parameter:

<?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

  • Das Problem dabei ist, dass parse_str params zu überschreiben scheint. Zumindest passiert das bei mir in PHP 7.1. Wenn Sie ein parse_str() ein zweites Mal verwenden, enthält das Array nur den letzten Wert. Ich bin mir nicht sicher, ob dies ein Fehler oder beabsichtigt ist.

    – Schlaflosigkeit88

    7. September 2020 um 9:35 Uhr

  • Wenn Ihnen diese Antwort gefallen hat, gefällt Ihnen vielleicht diese: cmd-Argumente leicht gemacht.

    – Peter Krebs

    17. August 2021 um 15:52 Uhr

Benutzer-Avatar
jeroen

Keine direkte Antwort auf Ihre Frage, aber eine bessere Lösung, denke ich:

Wenn Sie möchten, dass niemand außer cron das Skript ausführt, platzieren Sie es einfach außerhalb des Web-Stammverzeichnisses. Auf diese Weise findet überhaupt kein Zugriff über den Webserver statt.

Wenn Sie den Befehl auch als spezieller Benutzer ausführen müssen, verwenden Sie ihn nicht GET aber haben Sie eine Benutzeranmeldung und suchen Sie nach einer angemeldeten Sitzung (eine bestimmte festgelegte Sitzungsvariable …) und fügen Sie das Skript nur in diese Seite ein.

Ihr öffentlich zugängliches Skript würde in etwa so aussehen:

session_start();

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

Benutzer-Avatar
golabs

Mir ist klar, dass dieser Beitrag bereits mehrere Jahre alt ist, aber dieser hat mir am meisten geholfen, also lassen Sie mich auch meine Erkenntnisse teilen, um anderen zu helfen.

Ich verwende DirectAdmin und meine Cron-Beispiele funktionieren beide. Ich habe meine E-Mail-Adresse aus „Alle Cron-Ausgaben an E-Mail senden“ entfernt, damit ich keine E-Mail-Benachrichtigungen über meine Cronjobs erhalte.

Ich habe mit einer cURL-Anfrage begonnen, die alle 20 Minuten ausgeführt wird:

*/20 * * * * /usr/local/bin/curl --silent 'https://demo.tld/app/stats/?update&key=1234'

Bitte beachten Sie das ‘ ‘ um die URL, sonst können Sie nicht mehrere Parameter hinzufügen!

Ich verwende diese Seite als API-inspirierten Weg, um die Aktualisierung einiger Statistiken auszulösen, die ich von einer anderen Website sammle und die andere in JSON-Form von meiner abrufen können. Der Parameter „update“ löst den Update-Prozess aus und der Parameter „key“ löst bei Validierung zusätzliche Update-Aktionen aus, die ich nur ausführen möchte, wenn der Cronjob das Update anfordert.

Da der obige Cronjob grundsätzlich Bandbreite in beide Richtungen verbraucht, wollte ich mich für einen PHP-basierten Cronjob entscheiden, stieß aber auf ein Problem mit den Parametern … also fand ich diesen Beitrag, der mir den Tag gerettet hat 🙂

*/20 * * * * /usr/local/bin/php /home/path/to/public_html/app/stats/index.php update key=1234

Wie Sie sehen können, ist jetzt der Dateiname (index.php) im Pfad enthalten und dann folgen die Parameter (ohne die ? und &’s).

Auf diese Weise bekommen Sie den Cronjob zum Laufen, ABER Sie sind nur auf halbem Weg, da die Parameter nicht über weitergegeben werden $_GET… was ein bisschen nervig ist, wenn Sie Ihr Skript mit Überprüfungen für codiert haben $_GET Schlüssel!

Also, wie funktioniert es dann? Einfach (zumindest nach einiger Recherche) übergibt der Cronjob die Parameter über eine Variable namens an das Skript $argv.

Mit diesem Wissen suchte ich also nach einer Methode, um das zu transformieren $argv hinein $_GET Also:

  1. Ich kann das Update sowohl manuell als auch per Cronjob auslösen.
  2. Ich musste nicht mein ganzes Skript neu schreiben.

Ich habe die folgende Lösung gefunden, die wir nur wann ausführen möchten $argv ist eigentlich eingestellt, also habe ich es in die gewickelt if isset überprüfen:

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

Hoffe das hilft dir auch 🙂

Benutzer-Avatar
Ambarisch

* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234

Das wird nicht funktionieren

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234

Das funktioniert

Außerdem müssen Sie die Funktion parse_str() verwenden und den Wert abrufen

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

Das wird funktionieren:

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234

Benutzer-Avatar
Mike Mackintosh

Sie sollten in die schauen get_opt() oder $argv Funktion.

Benutzer-Avatar
Marco Marsala

username=test&password=test&code=1234

wird wurde:

php -r "$_GET["username"]="test"; $_GET["password"]="test"; $_GET["code"]="1234"; include "wp-cron.php";'

1283930cookie-checkÜbergeben von $_GET-Parametern an den Cron-Job

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy