cron で実行されるスクリプトから gpg を実行するにはどうすればよいですか?
質問
次のような部分を持つスクリプトがあります。
for file in `ls *.tar.gz`; do
echo encrypting $file
gpg --passphrase-file /home/$USER/.gnupg/backup-passphrase \
--simple-sk-checksum -c $file
done
何らかの理由で、このスクリプトを手動で実行すると、完全に正常に動作し、すべてのファイルが暗号化されます。これを cron ジョブとして実行すると、 echo $file
正常に動作しますが (ログに「encrypting <file>」と表示されます)、ファイルは暗号化されず、GPG サイレントは失敗し、stdout/stderr 出力が表示されません。
手がかりはありますか?
解決
答えは思ったよりも簡単だったことが分かりました。があります --batch
パラメータが欠落しているため、gpg は cron ジョブ用に存在しない /dev/tty から読み取ろうとします。私が使用したものをデバッグするには --exit-on-status-write-error
パラメータ。しかし、これを使用するには、echoing によって報告された終了ステータス 2 からインスピレーションを得ました。 $?
CDマンが示唆したように。
他のヒント
私の場合、GPGはキーを使用するためのホームディレクトリを見つけることができません:
GPG:デフォルトの秘密鍵はありません:秘密鍵がありません
GPG:0003608.cmd:署名+暗号化に失敗しました:秘密鍵がありません
それで私は追加しました --homedir /root/.gnupg
. 。最後のコマンドは次のようになります。
エコー「パスワード」| gpg -vvv ---homedir/root/.gnupg ---batch - passphrase-fd 0 -output/usr/share/file.gpg -encrypt - sign/usr/share/file.tar.bz2
cron ジョブの実行中に GPG がパスにあることを確認する必要があります。あなたの最善の推測は、GPGの完全なパスを取得することです(次のようにします) which gpg
)フルパスを使用して実行します(たとえば、 /usr/bin/gpp...
).
その他のデバッグのヒント:
- の値を出力します
$?
GPG を実行した後 (次のように:「$?」をエコーします)。これにより、終了コードが得られます。成功した場合、終了コードは 0 になります。 - STDERR を GPG の STDOUT にリダイレクトし、次に STDOUT をファイルにリダイレクトして、出力される可能性のあるエラー メッセージを検査します (これはコマンド ラインで実行できます:
/usr/bin/gpg ... 2>&1 >> gpg.log
)
cron ジョブを実行しているユーザーがファイルの暗号化に必要な権限を持っていることを確認してください。
一度この問題に遭遇したことがあります。
理由は詳しく言えませんが、cron がユーザーと同じ環境変数で実行されるとは思えません。
実際、プログラムを適切に実行するには、適切なパスをエクスポートする必要がありました。gpg は少なくとも実行しようとしていますか?
それとも、暗号化しようとしているファイルは、cron の実行時に実際に現在のディレクトリにありますか?
おそらく、実行してみてください echo whereis gpg
そして echo $PATH
スクリプトにそれが含まれているかどうかを確認してください...私のために働きました。
@skinp Cron ジョブは sh によって実行されますが、最近の Unix のほとんどは対話型ログインに bash または ksh を使用します。(私の経験上) 最大の問題は、sh が次のようなことを理解していないことです。
export PS1='\u@\h:\w> '
これを次のように変更する必要があります。
PS1='\u@\h:\w> '
export PS1
そのため、他のコマンドを実行する前に、最初の構文を使用して環境変数を定義するシェル スクリプトを cron が実行すると、sh が変数を定義しようとして爆発するため、他のコマンドは実行されません。
私の場合:「GPG:復号化に失敗しました:セッションキーが正しくありません。」
/usr/bin/gpg の追加、バージョンの確認、--batch の設定、--home (/root/.gnupg および /home/user/.gnupg を使用) の設定を試しましたが、すべて機能しませんでした。
/usr/bin/gpg -d --batch --homedir /home/ec2-user/.gnupg --no-mdc-warning -quiet --passphrase "$GPG_PP" "$file"
AWS Beanstalk インスタンスの cron には、--passphrase $GPG_PP の設定に使用される環境変数が必要であることがわかりました。今のクロン:
0 15 * * * $(source /opt/elasticbeanstalk/support/envvars && /home/ec2-user/bin/script.sh >> /home/ec2-user/logs/cron_out.log 2>&1)