我正在编写一个脚本,该脚本创建项目档案,然后创建它们的 7z 档案,以便我更轻松地保存特定版本并保留加密备份。
在生成档案并进入加密阶段后,gpg
如果可能的话,我想通过一次调用来加密文件,以便用户只输入一次密码。否则,我们要么必须将用户的密码短语缓存在内存中(我真的不想这样做),要么让他们为每个存档的项目输入并确认他们的密码短语(这更糟糕)。
有没有一种方法可以传递多个文件名以gpg
使其一次性加密所有文件名?
如果我尝试这个:
$ gpg --cipher-algo AES256 --compression-algo BZIP2 -c project1.7z project2.7z
...我在 shell 中看到以下错误:
usage: gpg [options] --symmetric [filename]
有没有办法实现我想要实现的目标?
答案1
由于 GnuPG 不直接支持这一点,因此执行此操作的方法是添加另一个层,例如使用tar
.
tar c project1.7z project2.7z | gpg --cipher-algo AES256 --compression-algo BZIP2 -co projects.gpg
并提取:
gpg -d projects.gpg | tar x
您将剩下project1.7z
和project2.7z
。然后您的脚本可以从您上次停下的地方继续。
答案2
Is there a way to pass multiple filenames to gpg to have it encrypt all of
them in one go?
不,那里没有。
您可能希望使用以下 gpg 选项之一传递密码(后者是最安全的选择):
--passphrase
--passphrase-file
--passphrase-fd
答案3
当前 gpg 有一个选项:
gpg --encrypt-files --recipient [email protected] *.txt
.txt.asc
为每个文件生成一个文件.txt
。
参考:
man gpg
选项--verify-files
,--encrypt-files
,--decrypt-files
和--multifile
- https://linoxy.com/gpg-command-encrypt-decrypt-file/
答案4
今天成功地做了这样的事情:
将目录更改为包含目标文件的目录,然后运行 Bash 脚本来查找所需的 file_names 并将它们列出到我称为 .txt 的文本文件中
found.txt
。运行一个 Bash 脚本,要求 gpg2 在循环中读取每个文件名并将其放入内存变量中,并在同一循环中使用我的签名密钥对其进行加密,并指定它供我自己读取。 gpg2 会弹出一个用于输入密码的弹出窗口,该弹出窗口有一个小复选框,您可以在其中选择在会话中保持密码短语处于活动状态。这是不好的做法,但如果您当时不在网络上,并且在加密会话后立即断电,那也不算太糟糕。
唯一的问题是有y/n需要处理。于是我把手指放在 Y 键上,不到一分钟就加密了 51 个文件。
脚本如下:
“查找”脚本是一个名为FindFilesAndListtoTextfile.sh
:
#! /usr/bin/bash
#Try this to list the files you want using the appropriate file identifier i.p.o "DSCN.*":
source="/home/myself/Whatever #note no gaps on either side of the equal-to sign
target="/home/myself/Whatever/found.txt"
find $source -name "*DSCN*" -type f > $target
加密脚本名为 ReadFilenameAndEncrypt.sh:
#!/bin/bash
line="/home/myself/Whatever/found.txt"
while IFS='' read -r line || [[ -n "$line" ]]; do
echo "Text read from file: $line"
gpg2 -e -u mysecretkeyID -r mysecretkeyID "$line"
done < "$1"
这将以普通用户身份运行:
$ bash ReadFilenameAndEncrypt.sh found.txt
希望这可以帮助。还没弄清楚如何避免 y/n。