¿Cómo tener una variable de entorno entre comillas en crontab?

¿Cómo tener una variable de entorno entre comillas en crontab?

Tengo un ejemplo mínimo de mi problema, que consiste en intentar instalar un crontab que se parece a este:

FOO="foo\"bar\"bin"

0 0 1 * * ls

ejecutando crontab crontab(lo tengo en un nombre de archivo crontab). Falla con este error:

% crontab crontab
"crontab":0: bad minute
crontab: errors in crontab file, can't install

Es la cita escapada, \"la que causa el problema.

¿Cómo puedo escapar de las comillas en las variables de entorno de crontab?

Para agregar un poco más de contexto, no estoy simplemente escribiendo variables en un crontab escrito manualmente. Este crontab es generado porcuando sea(una joya de Ruby), tiene alrededor de 70 entradas, recoge todas las variables de entorno y las coloca como variables en el crontab para que todas las credenciales estén disponibles para los scripts. El problema es que recientemente agregué uno complejo que tiene comillas y eso rompió este sistema.

Por si tienes curiosidad, el código Ruby que genera las variables es:

ENV.each do |key, value|
  env key.to_sym, value.inspect
end

Respuesta1

La buena práctica para crones:

  1. Crear script para ejecutar los comandos.
  2. Establecer variables en script. También es posible utilizar un archivo externo con variables:source /path/to/file/with/variables
  3. Utilice la ruta completa a los comandos/usr/bin/ls
  4. No confíe en su casa de usuario, ruta, etc.

Y aquí hay un ejemplo de cómo se puede crear un script de shell que ejecute rubyel programa en diferentes entornos.

En crontienes registros como (ejemplo):

0 1 * * * /path/script 1
0 2 * * * /path/script 2

El guión en sí es algo así como:

#!/bin/bash
a=$1
case "$a" in

1)  source /path/file1
    /path/to/ruby <parameters>
    ;;
2)  source /path/file2
    /path/to/ruby <parameters>
    ;;
<snip>

*) # do something if parameter is not enumerated
   ;;
esac

y file1contener algo como (ejemplo)

RUBYVAR1_1=1
RUBYVAR1_2=2

yfile2

RUBYVAR2_1=12
RUBYVAR2_2=22

Respuesta2

man 5 crontab

Una línea activa en un crontab será una configuración de entorno o un comando cron. Un entorno ambiental es de la forma,

 name = value

donde los espacios alrededor del signo igual (=) son opcionales y cualquier espacio posterior no inicial en el valor será parte del valor asignado al nombre. La cadena de valor se puede colocar entre comillas (simples o dobles, pero coincidentes) para conservar los espacios en blanco iniciales o finales.

Por lo tanto, encerrar la cadena que contiene comillas dobles entre comillas simples debería funcionar

Probado con un crontab:

var = 'this"contains"quotes'

* * * * * /usr/bin/env  >> /tmp/env

Lo que parece que almacenará correctamente las comillas dobles en var.

cat /tmp/env

HOME=/home/HBruijn
LANG=C.UTF-8
SHELL=/bin/sh
var=this"contains"quotes

Pero también estoy de acuerdo con la respuesta y el sentimiento anterior; cron no es un entorno de secuencias de comandos adecuado, es simplemente un programador de trabajos antiguo con muchas limitaciones y debe descargar cualquier cosa que parezca compleja e incluirla en el trabajo en sí.

Respuesta3

Por lo que pude encontrar, las variables crontab simplemente no pueden tener comillas y tampoco pueden tener más de 999 caracteres. La respuesta a esta pregunta es que simplemente no es posible.

información relacionada