Shell-Script
如何在不失去原始文件權限的情況下使用 gpg / gnupg 解密文件?
我目前正在嘗試自動化文件集合的加密和解密。對於我目前使用的加密:
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
相同的機制可用於在加密後對齊權限。我沒有進行任何性能測試,不確定其中一個選項是否更快。
我不會馬上接受這個作為答案,也許有人想出了比這更好的解決方案。