次のコマンドは、パスワードを要求せずにgpgファイルを抽出することを期待しています。
gpg --passphrase 1234 file.gpg
しかし、パスワードを要求します。どうして?
これも同じ動作をします:
gpg --passphrase-file passfile.txt file.gpg
私はgnome 3でUbuntuを使用していますが、Fedoraで動作していたことを覚えています
私はあなたとまったく同じ船に乗っています(UbuntuではなくFedoraで動作しました)。これは私が発見した明らかな回避策です:
echo your_password | gpg --batch --yes --passphrase-fd 0 your_file.gpg
説明:0
を渡すと、--passphrase-fd
がファイルではなくSTDINから読み取られます。したがって、パスフレーズをパイプすると、--passphrase-fd
を取得して、指定したパスワード文字列を受け入れることができます。
2017-12-04をアップグレードしました。 (パスフレーズのプロンプトを防ぐために--batchを追加する)
--batch
オプションを追加する必要がある場合があります。GPG
のバージョン2以降は、プロンプトを表示しないようにするためにオプション--batch
が必要です...わかりました。
$ gpg --version
gpg (GnuPG) 2.1.18
libgcrypt 1.7.6-beta
Copyright (C) 2017 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Home: /home/user /.gnupg
Supported algorithms:
Pubkey: RSA, ELG, DSA, ECDH, ECDSA, EDDSA
Cipher: IDEA, 3DES, CAST5, BLOWFISH, AES, AES192, AES256, TWOFISH,
CAMELLIA128, CAMELLIA192, CAMELLIA256
Hash: SHA1, RIPEMD160, SHA256, SHA384, SHA512, SHA224
Compression: Uncompressed, Zip, ZLIB, BZIP2
試してみる:
$ newdir=$(mktemp -d)
$ cd $newdir
$ seq 1 10 | gpg -c --batch --passphrase 1234 -o file.gpg -
$ ls -ltr
total 4
-rw-r--r-- 1 user user 91 Dec 4 15:42 file.gpg
$ hd file.gpg
00000000 8c 0d 04 07 03 02 ea fa d0 d3 2b 9a ea 06 df d2 |..........+.....|
00000010 4a 01 ed 50 74 ff 27 45 0e 6c 94 74 db e9 8a a5 |J..Pt.'E.l.t....|
00000020 03 9f 67 a0 73 97 e9 15 6b 56 a0 f0 88 71 85 a8 |..g.s...kV...q..|
00000030 dc 41 71 9f fa 3b f9 9d af ac 80 eb f4 f7 28 19 |.Aq..;........(.|
00000040 9f be 75 47 e6 d8 00 3e f6 60 f1 00 5e 63 57 ef |..uG...>.`..^cW.|
00000050 14 c3 4b 20 ff 94 03 03 c1 fc 98 |..K .......|
0000005b
いいね!さて:
$ gpg -d --batch --passphrase 1234 file.gpg
gpg: AES encrypted data
gpg: encrypted with 1 passphrase
1
2
3
4
5
6
7
8
9
10
-d
パラメータが指定されていない場合(SOの質問と同じ構文)、file.gpg
から復号化されたデータは新しいfile
に抽出されます。
$ gpg --batch --passphrase 1234 file.gpg
gpg: WARNING: no command supplied. Trying to guess what you mean ...
gpg: AES encrypted data
gpg: encrypted with 1 passphrase
$ ls -ltr
total 8
-rw-r--r-- 1 user user 91 Dec 4 15:42 file.gpg
-rw-r--r-- 1 user user 21 Dec 4 15:44 file
$ cat file
1
2
3
4
5
6
7
8
9
10
これはうまくいきます!
$ cd -
$ rm -fR $newdir
$ unset newdir
Gpgバージョン2.xの場合、--batch
を使用する必要はありません。
--pinentry-mode loopback
は--passphrase
と--passphrase-file
で機能し、ファイル名が競合している場合に新しい情報を入力できます。次に例を示します。
gpg --pinentry-mode loopback --passphrase-file=file encrypted.gpg
...
File 'encrypted' exists. Overwrite? (y/N)n
Enter new filename: f2
--batch
とは異なり、すぐに失敗し、...failed: File exists
(Debian Stable/Stretchのgpg 2.1.18でテストされています。重要な--passphrase
オプションを無視するこの動作は、バグがない場合は本当にバグです)
Gpg2を使用しているようです。 --batch
オプションも投入する必要があります。 (これをスクリプトに追加する場合は、--no-tty
とおそらく--yes
も追加する必要があります。)
Gpg(GnuPG)2.2.7を使用している場合manページによると、
--passphrase-fd n
ファイル記述子nからパスフレーズを読み取ります。最初の行だけがファイル記述子nから読み取られます。 nに0を使用すると、パスフレーズはSTDINから読み取られます。これは、パスフレーズが1つだけ指定されている場合にのみ使用できます。
--passphrase-fileファイル
ファイルfileからパスフレーズを読み取ります。最初の行だけがファイルfileから読み取られます。これは、パスフレーズが1つだけ指定されている場合にのみ使用できます。明らかに、ファイルに保存されているパスフレーズは、他のユーザーがこのファイルを読み取れる場合、セキュリティに問題があります。回避できる場合は、このオプションを使用しないでください。
-パスフレーズ文字列
文字列をパスフレーズとして使用します。これは、パスフレーズが1つだけ指定されている場合にのみ使用できます。明らかに、これはマルチユーザーシステムで非常に疑わしいセキュリティです。回避できる場合は、このオプションを使用しないでください。
追加 --pinentry-mode loopback
機能するために
バージョン2.0以降、このパスフレーズは--batchオプションも指定されている場合にのみ使用されることに注意してください。バージョン2.1以降、-pinentry-modeもループバックに設定する必要があります。
例えば:
gpg --batch --yes --passphrase="pw" --pinentry-mode loopback -o out -d in
私にとって、「-no-use-agent」を追加すると、「gpg(GnuPG)1.4.16」の問題が解決しました:
date > foo
echo pass > passphrase
# w/o --no-use-agent
> rm -f foo.gpg; gpg --cipher-algo aes256 --output foo.gpg --passphrase-file ./passphrase --batch --yes --symmetric foo
gpg: gpg-agent is not available in this session
gpg: can't query passphrase in batch mode
gpg: error creating passphrase: invalid passphrase
gpg: symmetric encryption of `foo' failed: invalid passphrase
> rm -f foo.gpg; gpg --cipher-algo aes256 --output foo.gpg --passphrase-file ./passphrase --batch --yes --no-use-agent --symmetric foo
> ls -al
total 20
drwxr-xr-x 2 root root 4096 Aug 22 13:59 .
drwx------ 18 root root 4096 Aug 22 13:58 ..
-rw-r--r-- 1 root root 30 Aug 22 13:58 foo
-rw-r--r-- 1 root root 103 Aug 22 13:59 foo.gpg
-rw-r--r-- 1 root root 5 Aug 22 13:58 passphrase
それは私にとって魔法のように機能しました:
echo "YOUR_PASS_PHRASE" | gpg --batch --yes --passphrase-fd 0 /home/somewhere/your_file.pgp
read -sp "Enter passphrase: " pass
echo "${pass}" | gpg --batch --no-tty --yes --passphrase-fd 0 --symmetric -o /path/to/saved/file.jpg.gpg /path/to/file.jpg
echo "${pass}" | gpg --batch --no-tty --yes --passphrase-fd 0 --decrypt -o /path/to/decrypted/file.jpg /path/to/encrypted/file.jpg.gpg
やってみましたか:
gpg --batch --passphrase-fd 0 --decrypt-files *.gpg
gpg --passphrase-fd 0 1234 file.gpg
出典: ここ
Man gpgで述べたように、次のオプションを使用できます
--pinentry-mode mode pinentryモードをmodeに設定します。モードに使用できる値は次のとおりです。
default
Use the default of the agent, which is ask.
ask Force the use of the Pinentry.
cancel Emulate use of Pinentry's cancel button.
error Return a Pinentry error (``No Pinentry'').
loopback
Redirect Pinentry queries to the caller. Note that in contrast to Pinentry the user is not prompted again if he enters a bad password.
したがって、このユーザーエージェントモードを「--pinentry-mode loopback」に変更すると、gpgのデフォルトの動作は、ユーザーにパスフレーズを要求することです。これは完全に正常に動作します。完全なコマンド
gpg --pinentry-mode loopback --passphrase <passphrase> -d <file to decrypt>
パスワードをコマンドラインに渡す非常に安全な方法はこれだと思います:
gpg --passphrase-file <(echo password) --batch --output outfile -c file
これにより、「echo」コマンドが生成され、ファイル記述子がパス名としてgpgに渡されます(/ dev/fd/63など)。次に、gpgはそこからキーを読み取ります。それまでの間、echoコマンドは並行して実行され、fdのバッファにキーを残して即座に終了する必要があります。
利点は次のとおりです。
私がubuntuでgpgが$ DISPLAYが設定されている場合はパスワードを要求し、設定を解除した場合はコマンドライン--passwordからパスワードを取得しようとすると、あなたは私を信じません。これは期待どおりに動作します:
DISPLAY= gpg --symmetric --passphrase pass --batch
エンジニアリングの過剰のもう1つの例だと思います。
ここに link からstackoverflowへの回答があります。 GnuPGがパスフレーズに非常に厳しいため、--passphrase
のみという難しい方法を学びましたまれに動作します。代わりに、--passphrase-fd
オプションの信頼性を高めてください。
これは script がproperを使用して--passphrase -fd
オプションを使用し、Travis-CI動作中のログを検索できます。
ここで、ここにいくつかのサンプルコードを提供せずに、回答へのリンクを投稿するつもりはありません。そこで、ここで、更新された「スタンドアロン」スクリプトを使用できます。
#!/usr/bin/env bash
# Set some variables for easy modding
Var_fd='9'
Var_pass="/path/to/passphrase.file"
Var_gpg_opts="--passphrase-fd ${Var_fd} --decrypt"
Var_output_location="out.txt"
Arr_string=( "$@" )
# Open file descriptor and shove the passphrase file into it
if [ -f "${Var_pass}" ]; then
exec ${Var_fd}<"${Var_pass}"
else
exec ${Var_fd}<(echo "${Var_pass}")
fi
# Pipe input array though gpg and append to output file
cat <<<"${Arr_string[*]}" | $(which gpg) ${Var_gpg_opts} >> ${Var_output_location}
# Do not forget to close the file descriptor
exec ${Var_fd}>&-
上記はGitHubのリンクされたプロテクトほど豪華ではありませんが、この投稿の冒頭にリンクされている回答よりもすべきです。
ハッキングハッピー。
~/.gnupg/gpg.conf
の最後に置く:
use-agent
pinentry-mode loopback
(たぶん新しい)ファイルの最後に置く~/.gnupg/gpg-agent.conf
:
allow-loopback-pinentry
次に、次のコマンドを実行します。
echo RELOADAGENT | gpg-connect-agent
これで、パスワードを要求せずにこれを実行できます。
echo "$1" | gpg2 --trust-model always --clearsign --batch --no-tty --quiet --no-verbose --yes -u $2 --digest-algo SHA512
--s2k-digest-algo SHA512 --passphrase "$3"
$ 1は暗号化するテキスト、$ 2はユーザーID、$ 3はパスワードです。
注:動作する理由は思い出せませんが、動作します。詳細がわかっている場合は、ここに編集して挿入してください
Linuxマシンで動作していることがわかった1つの簡単な方法は、次のとおりです。1)キーをgpgにインポートします:=> Shell> gpg —import private_key.key
2)暗号化して出力ファイル名を与える:=> Shell> gpg —output -d
2.1)上記のコマンドを入力すると、言い換えを入力するように求められます。言い換えを入力すると、gpgファイルが復号化されます。
gpg2 -se --passphrase yourpassword --batch --yes -r [email protected] filename
ubuntu 18.04の場合、これは私のために働きました-
暗号化:
pass='123'
gpg -c --batch --passphrase "$pass" some-file.tgz
復号化:
gpg some-file.tgz.gpg