GnuPG、bashスクリプトからパスワードプロンプト

GnuPG、bashスクリプトからパスワードプロンプト

bashスクリプトでパスワードを求める方法は?

次のエラーメッセージが表示されますproblem with the agent: Inappropriate ioctl for device

#!/bin/bash

fname="/home/user/elist.txt"
while IFS= read -r file
do
    tar czf "$file".tar.gz "$file"
    gpg --passphrase-fd 0 --no-symkey-cache --symmetric --cipher-algo AES256 "$file".tar.gz
done < "$fname"

答え1

与えられた--passphrase-fd 0ファイルgpgからパスワードを読み取ろうとします"$fname"。なぜなら、whileループ内でファイル記述子の0リダイレクトが始まる場所だからです。
これを機能させるいくつかのオプションがあります。

  • ループ全体を中かっこで囲み、標準入力を新しいファイル記述子にコピーして--passphrase-fd引数として使用します。

    fname="/home/user/elist.txt"
    {
      while IFS= read -r file
      do
          tar czf "$file".tar.gz -- "$file"
          gpg --passphrase-fd 3 --no-symkey-cache --symmetric --batch \
            --cipher-algo AES256 --pinentry-mode loopback -- "$file".tar.gz
      done < "$fname"
    } 3<&0
    
  • 明示的に新しいファイル記述子を開き、elist.txtここreadで標準入力をリダイレクトします(フルループの標準入力をリダイレクトする代わりに)。

    exec 3<"/home/user/elist.txt"
    while <&3 IFS= read -r file
    do
        tar czf "$file".tar.gz -- "$file"
        gpg --passphrase-fd 0 --no-symkey-cache --symmetric --batch \
          --cipher-algo AES256 --pinentry-mode loopback -- "$file".tar.gz
    done
    exec 3<&-
    
  • 明示的に新しいファイル記述子を開き、オプションの引数の代わりに使用します/dev/tty(スクリプトがターミナルで対話的に実行されている場合は問題ありません。パスワードが他のものから来た場合、期待どおりに機能しない可能性があります)。0--passphrase-fd

    fname="/home/user/elist.txt"
    exec 3</dev/tty
    while IFS= read -r file
    do
        tar czf "$file".tar.gz -- "$file"
        gpg --passphrase-fd 3 --no-symkey-cache --symmetric --batch \
          --cipher-algo AES256 --pinentry-mode loopback -- "$file".tar.gz
    done < "$fname"
    exec 3<&-
    

    よりきちんとした代わりに、/dev/ttyforから標準入力をリダイレクトしてコマンドを避けることができますgpg0</dev/tty gpg --passphrase-fd 0 ...exec

  • 正しく設定されていると仮定するとgpg-agent(たとえば、一部のLinuxディストリビューションでは、プロキシはpinentryユーザーと対話するために使用されるソケットアクティベーションシステムサービスであり、仮想端末とグラフィックセッションでデフォルトで機能します)、次のものを使用しないでください--passphrase-fd

    fname="/home/user/elist.txt"
    while IFS= read -r file
    do
        tar czf "$file".tar.gz -- "$file"
        gpg --no-symkey-cache --symmetric \
          --cipher-algo AES256 -- "$file".tar.gz
    done < "$fname"
    

引用後、--batchコマンドラインにおよびを追加しました。--pinentry-mode loopbackgpg--passphrase-fd手動

--batch...バージョン2.0以降、このオプションも一緒に指定した場合にのみこのパスワードを使用します。バージョン2.1以降、--pinentry-modeこの項目もに設定する必要がありますloopback

関連情報