2008-09-02 9 views
26

Ich habe ein Skript, das einen Teil hat, der so aussieht:Wie gpg aus einem Skript ausführen, das von cron ausgeführt wird?

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

Aus irgendeinem Grund, wenn ich dieses Skript manuell ausführen, funktioniert völlig in Ordnung und alle Dateien werden verschlüsselt. Wenn ich das als Cron-Job ausführe, funktioniert echo $file gut (ich sehe "<Datei>" im Protokoll), aber die Datei wird nicht verschlüsselt und gpg silent schlägt fehl, ohne stdout/stderr-Ausgabe.

Irgendwelche Hinweise?

Antwort

25

Es stellt sich heraus, dass die Antwort einfacher war, als ich erwartet hatte. Es gibt einen --batch Parameter, der fehlt, gpg versucht, von/dev/tty zu lesen, das für Cron-Jobs nicht existiert. Um zu debuggen habe ich --exit-on-status-write-error param. Aber um das zu nutzen, wurde ich von Exit-Status 2 inspiriert, berichtet von echo $? als Cd-Man vorgeschlagen.

+2

Vielen Dank dafür, wir hatten das gleiche Problem! – latortuga

+0

gleiche Frage hier. --Batch funktioniert. – user1052080

+0

Vielen Dank, gleiche Frage hier. Sie sollten die Option --batch in gpg --help enthalten ... zumindest in meiner Version (1.4.10) fehlt sie. – tbk

0

Stellen Sie sicher, dass der Benutzer, der den Cron-Job ausführt, über die erforderlichen Berechtigungen zum Verschlüsseln der Datei verfügt.

0

Ich bin einmal auf dieses Problem gestoßen.

Ich kann dir nicht wirklich sagen, warum, aber ich denke nicht, dass Cron mit der gleichen Umgebungsvariablen wie der Benutzer ausführt.

Ich musste eigentlich den guten Pfad exportieren, damit meine Programme gut ausgeführt werden können. Ist gpg zumindest versucht auszuführen?

Oder sind die Dateien, die Sie versuchen, im aktuellen Verzeichnis zu verschlüsseln, wenn der Cron ausgeführt wird?

Vielleicht versuchen, eine echo whereis gpg und echo $PATH in Ihrem Skript auszuführen, um zu sehen, ob es enthalten ist ... Arbeitete für mich.

1

Sie sollten sicherstellen, dass GPG in Ihrem Pfad ist, wenn der Cronjob ausgeführt wird. Ihre beste Schätzung wäre es, den vollständigen Pfad von GPG zu erhalten (indem Sie which gpg tun) und es unter Verwendung des vollständigen Pfades ausführen (zum Beispiel /usr/bin/gpp...).

Einige andere Debugging-Tipps:

  • Ausgang der Wert $? nach GPG läuft (wie diese: "$" Echo). Dies gibt Ihnen den Exit-Code, der 0 sein sollte, wenn es erfolgreich
  • die STDERR zu STDOUT für GPG umleiten und dann STDOUT in eine Datei umleiten, um Fehlermeldungen zu prüfen, die möglicherweise gedruckt werden (Sie können dies eine Befehlszeile tun) : /usr/bin/gpg ... 2>&1 >> gpg.log)
0

@skinp Cron-Jobs werden von sh ausgeführt, während die meisten modernen Unixes bash oder ksh für interaktive Logins verwenden. Das größte Problem (in meiner Erfahrung) ist, dass sh nicht versteht, Dinge wie:

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

, die geändert werden muss: So

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

wenn cron ein Shell-Skript ausgeführt wird, die eine Umgebung definiert Variable, die die erste Syntax verwendet, bevor ein anderer Befehl ausgeführt wird, wird der andere Befehl nie ausgeführt, da sh versucht, die Variable zu definieren.

5

In meinem Fall gpg kann nicht finden Hauptdir für die Verwendung von Tasten:

gpg: kein Standard-Geheimschlüssel: keine geheimen Schlüssel

gpg: 0003608.cmd: sign + encrypt fehlgeschlagen: Keine geheimen Schlüssel

Also fügte ich --homedir /root/.gnupg hinzu. Der letzte Befehl kann wie folgt aussehen:

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

0

In meinem Fall: "gpg: Entschlüsselung fehlgeschlagen: Bad Session Key".

Versucht,/usr/bin/gpg, Überprüfung der Version, Einstellung --batch, Einstellung --home (mit /root/.gnupg und /home/user/.gnupg) und alles hat nicht funktioniert.

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

dass cron auf AWS stellte sich heraus, bohnenstange Beispiel die Umgebungsvariable die --passphrase $ GPG_PP einzustellen verwendet wird benötigt. Cron jetzt:

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