2008-09-02 10 views
26

Tengo un script que tiene una parte que se ve así:¿Cómo ejecutar gpg desde un script ejecutado por cron?

for file in `ls *.tar.gz`; do 
    echo encrypting $file 
    gpg --passphrase-file /home/$USER/.gnupg/backup-passphrase \ 
    --simple-sk-checksum -c $file 
done 

Por alguna razón, si me quedo este script manualmente, funciona perfectamente bien y todos los archivos están encriptados. Si ejecuto esto como tarea cron, echo $file funciona bien (veo "cifrar <archivo>" en el registro), pero el archivo no se cifra y gpg silencioso falla sin salida de stdout/stderr.

¿Alguna pista?

Respuesta

25

Resultó que la respuesta fue más fácil de lo que esperaba. Falta un parámetro --batch, gpg intenta leer de/dev/tty que no existe para trabajos cron. Para depurar que he usado --exit-on-status-write-error param. Pero para usar eso, me inspiré en el estado de salida 2, reportado haciendo eco de $? como lo sugirió Cd-Man.

+2

Gracias por esto, estábamos teniendo exactamente el mismo problema! – latortuga

+0

mismo problema aquí. - lote trabajado – user1052080

+0

Muchas gracias, el mismo problema aquí. Deben incluir la opción --batch en gpg --help ... al menos en mi versión (1.4.10) falta. – tbk

0

asegúrese de que el usuario que ejecuta el trabajo cron tenga los permisos necesarios para encriptar el archivo.

0

He encontrado este problema una vez.

No puedo decir por qué, pero no creo que cron se ejecute con la misma variable de entorno que el usuario.

De hecho, tuve que exportar la buena ruta para que mis programas se ejecutaran bien. ¿Está gpg al menos intentando ejecutarse?

¿O son los archivos que intentas encubrir en realidad en el directorio actual cuando se ejecuta el cron?

Quizás intente ejecutar un echo whereis gpg y echo $PATH en su secuencia de comandos para ver si está incluido ... Funcionó para mí.

1

Debe asegurarse de que GPG esté en su camino cuando se está ejecutando cronjob. Su mejor suposición sería obtener la ruta completa de GPG (haciendo which gpg) y ejecutarla usando la ruta completa (por ejemplo, /usr/bin/gpp...).

Algunas otras sugerencias de depuración:

  • salida el valor de $? después de ejecutar GPG (de esta manera: "? $" Eco). Esto le da el código de salida, que debería ser 0, si tuvo éxito
  • redirigir el STDERR a STDOUT para GPG y luego redirigir STDOUT a un archivo, para inspeccionar cualquier mensaje de error que pueda imprimirse (puede hacer esto una línea de comando : /usr/bin/gpg ... 2>&1 >> gpg.log)
0

@skinp Los trabajos de cron se ejecutan por sh, mientras que la mayoría de los Unixes modernos usan bash o ksh para inicios de sesión interactivos. El mayor problema (en mi experiencia) es que sh no entiende cosas como:

export PS1='\[email protected]\h:\w> ' 

que necesita ser cambiado a:

PS1='\[email protected]\h:\w> ' 
export PS1 

Así que si cron se ejecuta un script de shell que define un entorno variable usando la primera sintaxis, antes de ejecutar algún otro comando, el otro comando nunca será ejecutado porque sh bombardea tratando de definir la variable.

5

En mi caso gpg no puede encontrar su casa dir para usar claves:

gpg: ninguna clave secreta por defecto: No clave secreta

gpg: 0003608.cmd: signo + cifrar falló: No clave secreta

Así que agregué --homedir /root/.gnupg. El comando final puede verse como

echo 'contraseña' | gpg -vvv --homedir /root/.gnupg --batch --passphrase-fd 0 --output /usr/share/file.gpg --encrypt --sign /usr/share/file.tar.bz2

0

En mi caso: "gpg: descifrado fallido: tecla de sesión incorrecta".

Intenté agregar/usr/bin/gpg, comprobando la versión, configuración --batch, setting --home (con /root/.gnupg y /home/user/.gnupg) y todo no funcionó.

/usr/bin/gpg -d --batch --homedir /home/ec2-user/.gnupg --no-mdc-warning -quiet --passphrase "$GPG_PP" "$file" 

resultó que cron en AWS planta de frijoles instancia necesaria la variable de entorno que se utiliza para establecer el --passphrase $ GPG_PP. Cron ahora:

0 15 * * * $(source /opt/elasticbeanstalk/support/envvars && /home/ec2-user/bin/script.sh >> /home/ec2-user/logs/cron_out.log 2>&1) 
Cuestiones relacionadas