bash - tareas - ¿Cómo ejecutar gpg desde un script ejecutado por cron?
instalar crontab ubuntu (6)
Debes asegurarte de que GPG esté en tu camino cuando el cronjob se esté ejecutando. Tu mejor opción sería obtener la ruta completa de GPG (haciendo which gpg
) y ejecutarla usando la ruta completa (por ejemplo /usr/bin/gpp...
).
Algunos otros consejos de depuración:
- salida el valor de
$?
después de ejecutar GPG (como este: echo "$?"). Esto le da el código de salida, que debería ser 0, si sucedió - 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 con una línea de comando:
/usr/bin/gpg ... 2>&1 >> gpg.log
)
Tengo un script que tiene una parte que se ve así:
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 ejecuto este script manualmente, funciona perfectamente bien y todos los archivos están encriptados. Si ejecuto esto como tarea cron, el echo $file
funciona bien (veo "encriptar <archivo>" en el registro), pero el archivo no se cifra y gpg silencioso falla sin salida de stdout / stderr.
¿Alguna pista?
He encontrado este problema una vez.
Realmente no puedo decirte 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. Es gpg al menos tratando de ejecutar?
¿O los archivos que intentas encubrir están en el directorio actual cuando se ejecuta el cron?
Tal vez intente ejecutar un echo whereis gpg
y echo $PATH
en su script para ver si está incluido ... Funcionó para mí.
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, informado por echoing $?
como lo sugirió Cd-Man.
asegúrese de que el usuario que ejecuta el trabajo cron tenga los permisos necesarios para encriptar el archivo.
Los trabajos de @skinp Cron se ejecutan por sh, mientras que los Unixes más 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=''/u@/h:/w> ''
que necesita ser cambiado a:
PS1=''/u@/h:/w> ''
export PS1
Entonces, si cron ejecuta un script de shell que define una variable de entorno 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.
En mi caso, gpg no puede encontrar el directorio de inicio para usar claves:
gpg: ninguna clave secreta predeterminada: ninguna clave secreta
gpg: 0003608.cmd: signo + cifrado fallido: sin 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