bash - operazioni - crontab linux



Come eseguire gpg da uno script eseguito da cron? (4)

Ho uno script che ha una parte che sembra così:

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

Per qualche ragione se eseguo questo script manualmente, funziona perfettamente e tutti i file sono crittografati. Se eseguo questo come cron job, echo $file funziona bene (vedo "encrypting <file>" nel log), ma il file non viene crittografato e gpg silent fallisce senza output stdout / stderr.

Qualche indizio?

https://ffff65535.com


Assicurati che GPG sia nel tuo percorso quando il cronjob è in esecuzione. La tua ipotesi migliore sarebbe ottenere il percorso completo di GPG (eseguendo which gpg ) e eseguirlo utilizzando il percorso completo (ad esempio /usr/bin/gpp... ).

Alcuni altri suggerimenti per il debug:

  • emettere il valore di $? dopo aver eseguito GPG (come questo: echo "$?"). Questo ti dà il codice di uscita, che dovrebbe essere 0, se è successo
  • reindirizzare lo STDERR in STDOUT per GPG e quindi reindirizzare STDOUT in un file, per ispezionare eventuali messaggi di errore che potrebbero essere stampati (è possibile eseguire una riga di comando: /usr/bin/gpg ... 2>&1 >> gpg.log )

Mi sono imbattuto in questo problema una volta.

Non posso davvero dirti perché, ma non penso che cron venga eseguito con la stessa variabile d'ambiente che l'utente fa.

In realtà ho dovuto esportare il buon percorso per far funzionare bene i miei programmi. Gpg sta cercando almeno di eseguire?

O i file che stai cercando di codificare effettivamente nella directory corrente quando viene eseguito il cron?

Forse prova ad eseguire echo whereis gpg ed echo $PATH nel tuo script per vedere se è incluso ... Ha funzionato per me.


assicurarsi che l'utente che esegue il processo cron disponga delle autorizzazioni necessarie per crittografare il file.


I lavori di @skinp Cron vengono eseguiti da sh, mentre la maggior parte degli Unix moderni usa bash o ksh per gli accessi interattivi. Il problema più grande (nella mia esperienza) è che sh non comprende cose come:

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

che deve essere cambiato in:

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

Quindi se cron esegue uno script di shell che definisce una variabile di ambiente usando la prima sintassi, prima di eseguire qualche altro comando, l'altro comando non verrà mai eseguito perché sh bomb out cerca di definire la variabile.





gnupg