gpg/pinentry - 端末の外部でパスワードを入力できません。

gpg/pinentry - 端末の外部でパスワードを入力できません。

スクリプト内でgpgファイルの復号化を試みます。端末で実行すると、gpg -d file.gpg呪いダイアログボックスにパスワードを入力するように求められます。ただし、その行を含むスクリプトを実行すると、「gpg:decryption failed:No key」というメッセージが表示された場合、または対話型端末で実行されないと自動的に失敗します。

理想的には、ターミナルウィンドウでRunを実行するときですpinentry-curses

qtまたはgtkを使用してpinentryプログラムを実行するように設定すると、ソースに関係なく毎回グラフィックウィンドウが表示されます。これが私が複製したい動作です。私はこれがqtやgtkに依存したくありません。

答え1

gpg2 を仮定すると、セキュリティなどに対するいかなる主張もしないことに注意しながら、いくつかのソリューションを提供できます。

パスワード入力用の端末をあらかじめ生成してください。ここに 2 つのコマンドを入力します。

tty
gpg-agent --pinentry-program /usr/bin/pinentry-curses --daemon sleep 999999

たとえば、これは使用中のptyを印刷して/dev/pts/10からgpgエージェントを実行します。 gpgエージェントは、sleepこの端末でこれ以上読み取らないように「中断」されます。

他のシェルで何かを復号化する必要がある場合は、まず次のように環境を設定してください。

export GPG_TTY=/dev/pts/10 
export GPG_AGENT_INFO=/run/user/1000/gnupg/S.gpg-agent:0:1

ここで、1000はユーザーIDです。 (gpg-agentオプションから始めて、このソケットの名前を取得できます-v。よりきれいな方法で取得できると確信しています。)

:0:1メッセージの最後に追加された内容は実際にプロキシのpidバージョンとプロトコルバージョンである必要がありますが、0が許可されているようです。 (ソケットが上記のパス名にない場合は、そのソケットを使用しないか、gpg2構成ファイルにいくつかのオプションが設定されている可能性があります。)

あなた今しなければならない--use-agentコマンドを復号化するオプションを追加します gpg。これにより、pinentryプログラムのcursesバージョンが事前に生成された端末に表示され、パスワードを入力できるようになります。

関連情報