Shell-Script

如何在不失去原始文件權限的情況下使用 gpg / gnupg 解密文件?

  • August 31, 2021

我目前正在嘗試自動化文件集合的加密和解密。對於我目前使用的加密:

gpg --batch --recipient [RECIPIENT] --encrypt-files [FILES]

對於解密,我使用的幾乎相同:

gpg --batch --decrypt-files [FILES]

但是在加密和解密過程中,原始文件權限都會失去:

$ gpg --batch --recipient aram --encrypt-files foo
$ ls -l foo*
-rw------- 1 aram aram foo
-rw-r--r-- 1 aram aram foo.gpg

$ rm foo && gpg --batch --decrypt-files foo
$ ls -l foo*
-rw-r--r-- 1 aram aram foo
-rw-r--r-- 1 aram aram foo.gpg

我在加密過程中沒問題,我可以手動設置文件權限。但在解密過程中,除了存在安全風險之外,一些文件(如 ssh 密鑰)在沒有適當權限的情況下使用功能。

是否有在批量解密期間保留文件權限的機制?

當然,我可以遍歷文件,讀取權限,解密然後再次設置權限。但是這種方式破壞了批量解密的意義。


gnupg.org 上有一個開放的問題,現在已經 4 年了,從那時起就沒有太多活動:https ://dev.gnupg.org/T2945

正如@ab@frostschutz建議的那樣,將文件包裝在文件中tar然後加密是一種選擇。

但是,我想在不解密的情況下訪問原始文件結構。目前,我已採取在批量解密後對齊文件權限的方式。當解密的文件已經在磁碟上時,這具有對齊權限的額外好處:

gpg --batch --decrypt-files $files

for encrypted in $files ; do
 decrypted=${encrypted%.gpg}
 chmod --reference="$encrypted" -- "$decrypted"
done

當然,也可以在每次解密文件後進行對齊:

for encrypted in $files ; do
 gpg --decrypt-files "$encrypted"

 decrypted=${encrypted%.gpg}
 chmod --reference="$encrypted" -- "$decrypted"
done

如果您想絕對確定解密文件永遠不會比加密文件擁有更多權限,您可以使用臨時虛擬文件並強制gpg覆蓋它:

for encrypted in $files ; do
 decrypted=${encrypted%.gpg}

 touch "$decrypted" && chmod --reference="$encrypted" -- "$decrypted"
 gpg --yes --decrypt-files "$encrypted"
done

相同的機制可用於在加密後對齊權限。我沒有進行任何性能測試,不確定其中一個選項是否更快。


我不會馬上接受這個作為答案,也許有人想出了比這更好的解決方案。

引用自:https://unix.stackexchange.com/questions/666959