Frage

Ich habe ein Skript, dessen Teil so aussieht:

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

Wenn ich dieses Skript manuell ausführe, funktioniert es aus irgendeinem Grund einwandfrei und alle Dateien sind verschlüsselt.Wenn ich das als Cronjob ausführe, echo $file funktioniert einwandfrei (ich sehe „encrypting <file>“ im Protokoll), aber die Datei wird nicht verschlüsselt und gpg Silent schlägt ohne stdout/stderr-Ausgabe fehl.

Irgendwelche Hinweise?

War es hilfreich?

Lösung

Es stellte sich heraus, dass die Antwort einfacher war, als ich erwartet hatte.Da ist ein --batch Parameter fehlt, gpg versucht, aus /dev/tty zu lesen, das für Cron-Jobs nicht existiert.Zum Debuggen habe ich es verwendet --exit-on-status-write-error param.Aber um das zu nutzen, wurde ich durch den Exit-Status 2 inspiriert, der von Echoing berichtet wurde $? wie Cd-Man vorgeschlagen hat.

Andere Tipps

In meinem Fall kann gpg das Home-Verzeichnis für die Verwendung von Schlüsseln nicht finden:

gpg:kein standardmäßiger geheimer Schlüssel:Kein geheimer Schlüssel

gpg:0003608.cmd:Signieren+Verschlüsselung fehlgeschlagen:Kein geheimer Schlüssel

Also habe ich hinzugefügt --homedir /root/.gnupg.Der letzte Befehl kann so aussehen

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

Sie sollten sicherstellen, dass sich GPG in Ihrem Pfad befindet, wenn der Cronjob ausgeführt wird.Ihre beste Vermutung wäre, den vollständigen Pfad von GPG zu erhalten (indem Sie Folgendes tun). which gpg) und führen Sie es unter Verwendung des vollständigen Pfads aus (z. B /usr/bin/gpp...).

Einige weitere Debugging-Tipps:

  • Geben Sie den Wert von aus $? nach dem Ausführen von GPG (wie folgt:Echo „$?“).Dadurch erhalten Sie den Exit-Code, der bei Erfolg 0 sein sollte
  • Leiten Sie STDERR nach STDOUT für GPG um und leiten Sie dann STDOUT in eine Datei um, um eventuell ausgegebene Fehlermeldungen zu überprüfen (Sie können dies über eine Befehlszeile tun: /usr/bin/gpg ... 2>&1 >> gpg.log)

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

Ich bin einmal auf dieses Problem gestoßen.

Ich kann Ihnen nicht wirklich sagen, warum, aber ich glaube nicht, dass Cron mit derselben Umgebungsvariablen ausgeführt wird wie der Benutzer.

Ich musste tatsächlich den guten Pfad exportieren, damit meine Programme gut ausgeführt wurden.Versucht gpg zumindest, es auszuführen?

Oder befinden sich die Dateien, die Sie verschlüsseln möchten, tatsächlich im aktuellen Verzeichnis, wenn der Cron ausgeführt wird?

Versuchen Sie vielleicht, a auszuführen echo whereis gpg Und echo $PATH in Ihrem Skript, um zu sehen, ob es enthalten ist ...Hat bei mir funktioniert.

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

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

was geändert werden muss in:

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

Wenn also cron ein Shell-Skript ausführt, das eine Umgebungsvariable mit der ersten Syntax definiert, bevor ein anderer Befehl ausgeführt wird, wird der andere Befehl niemals ausgeführt, da sh beim Versuch, die Variable zu definieren, scheitert.

In meinem Fall:"gpg:Entschlüsselung fehlgeschlagen:Ungültiger Sitzungsschlüssel".

Ich habe versucht, /usr/bin/gpg hinzuzufügen, die Version zu überprüfen, --batch festzulegen, --home festzulegen (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"

Es stellte sich heraus, dass Cron auf der AWS Beanstalk-Instanz die Umgebungsvariable benötigte, um die --passphrase $GPG_PP festzulegen.Cron jetzt:

0 15 * * * $(source /opt/elasticbeanstalk/support/envvars && /home/ec2-user/bin/script.sh >> /home/ec2-user/logs/cron_out.log 2>&1)
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top