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/tty
forから標準入力をリダイレクトしてコマンドを避けることができますgpg
。0</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 loopback
gpg
--passphrase-fd
手動、
--batch
...バージョン2.0以降、このオプションも一緒に指定した場合にのみこのパスワードを使用します。バージョン2.1以降、--pinentry-mode
この項目もに設定する必要がありますloopback
。