Pasar parámetros GET GET a cron job


Soy nuevo en cron jobs y no estoy seguro de si esto funcionaría.

Por motivos de seguridad, pensé en hacer un script de una página que busque ciertos valores GET (un nombre de usuario, una contraseña y un código de seguridad) para asegurarse de que solo el equipo y alguien que conozca los 3 puedan ejecutar el comando.

Hice el script y funciona ejecutándolo en un navegador, pero ¿es posible ejecutar el trabajo cron con los valores GET?

Un ejemplo sería yo corriendo

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

Es esto posible?

Author: Cœur, 2012-07-02

8 answers

El $_GET[] & $_POST[] las matrices asociativas solo se inicializan cuando se invoca el script a través de un servidor web. Cuando se invoca a través de la línea de comandos, los parámetros $argv matriz, al igual que C.

Contiene una matriz de todos los argumentos pasados al script cuando corriendo desde la línea de comandos.

Su orden sería:

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

Entonces usarías parse_str () para establecer y acceder a los parámetros:

<?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
 71
Author: RobB,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-05-23 22:35:20

No es una respuesta directa a su pregunta, sino una mejor solución Creo:

Si desea que nadie excepto cron ejecute el script, simplemente colóquelo fuera de la raíz web. De esa manera no hay acceso a través del servidor web en absoluto.

Si también necesita ejecutar el comando como un usuario especial, no use GET, sino que tenga un inicio de sesión de usuario y verifique si hay una sesión iniciada (una determinada variable de sesión establecida...) e incluir el script solo en esa página.

Su script de acceso público mira algo como:

session_start();

if (isset($_SESSION['user']))
{
  include '/path/to/script/outside/of/web-root';
}
else
{
  die('No access.');
}
 10
Author: jeroen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-02 17:04:59
* 3 * * * /path_to_script/cronjob.php?username=test&password=test&code=1234

Esto no funcionará

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

Esto funciona

También, necesitas usar la función parse_str () y obtener valor

$str = "first=value&arr[]=foo+bar&arr[]=baz";
parse_str($str);
echo $first;  // value
echo $arr[0]; // foo bar
echo $arr[1]; // baz
 5
Author: Ambarish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-10 21:58:04

Debe buscar en la función get_opt() o arg argv.

 1
Author: Mike Mackintosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-02 17:00:55

Esto funcionará:

* 3 * * * /path_to_script/cronjob.php username=test password=test code=1234
 0
Author: ZnArK,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-02 16:56:00

Me resulta útil usar la función getopt() cuando necesito parámetros de un cron o un comando de consola.

Esta función devolverá una matriz de pares opción / argumento, o FALSE en caso de fallo.

Los siguientes ejemplos han sido tomados directamente de la documentación de PHP.

$options = getopt("f:hp:");
var_dump($options);


shell> php example.php -fvalue -h

El ejemplo anterior mostrará:

array(2) {
    ["f"]=>
    string(5) "value"
    ["h"]=>
    bool(false)
}

Para más opciones y diferentes parámetros, eche un vistazo al documentación.

Recursos

 0
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-04 07:58:23

Me doy cuenta de que este post ya tiene varios años, pero este me ayudó más, así que déjame compartir mis hallazgos también para ayudar a otros también.

Estoy usando DirectAdmin y mis ejemplos cron funcionan ambos. Eliminé mi dirección de correo electrónico de 'Enviar toda la salida de Cron al correo electrónico' para no recibir notificaciones por correo electrónico de mis cronjobs.

Empecé con una solicitud de cURL que se ejecuta cada 20 minutos:

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

Tenga en cuenta el '' alrededor de la URL, de lo contrario ¡no puedes agregar múltiples parámetros!

Utilizo esa página como una forma inspirada en la API para activar la actualización de algunas estadísticas que recopilo de otro sitio web y que otros pueden obtener en forma JSON de la mía. El parámetro 'update' desencadena el proceso de actualización y el parámetro 'key', cuando se valida, desencadenará acciones de actualización adicionales que solo quiero realizar cuando el cronjob solicite la actualización.

Desde arriba cronjob básicamente consume ancho de banda en ambas direcciones que quería para ir por un cronjob basado en PHP, pero se encontró con un problema con los parámetros... así que es cuando encontré este post que salvó mi día:)

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

Como puede ver el nombre del archivo (index.php) ahora se incluye en la ruta y luego siguen los parámetros (sin el ? and & ' s).

De esta manera, el cronjob funciona, PERO solo está a mitad de camino, ya que los parámetros no se pasarán a través de $_GET... lo cual es un poco molesto cuando has codificado tu script con cheques para $_GET ¡llaves!

Entonces, ¿cómo funciona? Simple (al menos después de alguna investigación), el cronjob pasa los parámetros al script a través de una variable llamada $argv.

Así que con ese conocimiento busqué un método para transformar el $argv en $_GET así:

  1. Puedo activar la actualización tanto manualmente como a través del cronjob.
  2. No tuve que reescribir todo mi guión.

Encontré la siguiente solución que solo queremos ejecutar cuando $argv es en realidad set, así que lo envolví en el if isset check:

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

Espero que esto también te ayude:)

 0
Author: golabs,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-05 12:32:04

username=test&password=test&code=1234

Se convertirá en:

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

 0
Author: Marco Marsala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-28 08:36:00