Comment exécuter gpg à partir d'un script exécuté par cron?

j'ai un script qui a une partie qui ressemble à ça:

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

Pour une raison que si j'exécute ce script manuellement, fonctionne parfaitement bien et tous les fichiers sont cryptés. Si je l'exécute en tant que tâche cron, echo $file fonctionne très bien (je vois "encrypting " dans le log), mais le fichier n'est pas crypté et gpg silent échoue sans sortie stdout/stderr.

Toute indices?

26
demandé sur Marcin 2008-09-02 19:58:49

7 réponses

il s'avère que la réponse était plus facile que je m'y attendais. Il y a un --batch paramètre manquant, gpg essaie de lire depuis /dev/tty qui n'existe pas pour les jobs cron. Pour déboguer que j'ai utilisé --exit-on-status-write-error param. Mais pour utiliser cela, j'ai été inspiré par exit status 2, rapporté par echoing

25
répondu Marcin 2008-09-02 17:48:02

dans mon cas gpg cant trouver home dir pour utiliser les clés:

gpg: pas de clé secrète par défaut: Pas de clé secrète

gpg: 0003608.cmd: signe+chiffrement échoué: aucune clé secrète

donc j'ai ajouté --homedir /root/.gnupg. La commande finale peut ressembler à

echo 'mot de passe' | gpg -vvv --homedir /root/.gnupg -- batch -- passphrase-fd 0 --sortie /usr/share/fichier.gpg --encrypt --sign/usr/share / file.goudron.bz2

7
répondu Sllouyssgort 2011-10-02 06:26:02

vous devez vous assurer que GPG est dans votre chemin lorsque cronjob est lancé. Votre meilleure supposition serait d'obtenir le chemin complet de GPG (en faisant which gpg) et l'exécuter en utilisant le chemin complet (par exemple /usr/bin/gpp...).

quelques autres conseils de débogage:

  • sortie la valeur de $? après avoir lancé GPG (comme ceci: echo"$?"). Cela vous donne le code de sortie, qui devrait être 0, si elle a réussi
  • rediriger le STDERR vers STDOUT pour GPG puis rediriger STDOUT vers un fichier, d'inspecter tous les messages d'erreur qui pourraient être imprimé (vous pouvez le faire en ligne de commande: /usr/bin/gpg ... 2>&1 >> gpg.log)
1
répondu Grey Panther 2008-09-02 16:15:26

assurez-vous que l'utilisateur qui exécute la tâche cron a les autorisations nécessaires pour crypter le fichier.

0
répondu Nick Berardi 2008-09-02 16:02:43

j'ai rencontré ce problème une fois.

Je ne peux pas vraiment vous dire pourquoi, mais je ne pense pas que cron exécute avec la même variable d'environnement que l'utilisateur.

en fait j'ai dû exporter le bon chemin pour que mes programmes s'exécutent correctement. Est-ce que gpg essaie au moins d'exécuter?

ou les fichiers que vous tentez d'encoder sont-ils réellement dans le répertoire courant lorsque le cron exécute?

Peut-être essayer d'exécuter un echo whereis gpg et echo $PATH dans votre script pour voir s'il est inclus... A travaillé pour moi.

0
répondu skinp 2008-09-02 16:09:05

@skinp les tâches Cron sont exécutées par sh, alors que la plupart des Unixes modernes utilisent bash ou ksh pour les logins interactifs. Le plus gros problème (d'après mon expérience) est que sh ne comprend pas les choses comme:

export PS1='\u@\h:\w> '

qui doit être changé:

PS1='\u@\h:\w> '
export PS1

donc si cron exécute un script shell qui définit une variable d'environnement en utilisant la première syntaxe, avant d'exécuter une autre commande, l'autre commande ne sera jamais exécutée parce que sh bombarde en essayant de définir la variable.

0
répondu dr-jan 2008-09-03 23:04:32

Dans mon cas: "gpg: le déchiffrement a échoué: la Mauvaise clé de session".

a essayé d'ajouter / usr/bin /gpg, de vérifier la version, de définir --batch, de définir --home (with/root/.gnupg et /home/utilisateur/.gnupg) et tout n'a pas fonctionné.

/usr/bin/gpg -d --batch --homedir /home/ec2-user/.gnupg --no-mdc-warning -quiet --passphrase "$GPG_PP" "$file"
0 15 * * * $(source /opt/elasticbeanstalk/support/envvars && /home/ec2-user/bin/script.sh >> /home/ec2-user/logs/cron_out.log 2>&1)
0
répondu Mike Lapinskas 2017-12-14 19:08:42