Có cách nào để nguồn một tệp được mã hóa (GPG) đang hoạt động trong một tập lệnh không?


8

Tôi cần một tập lệnh bash để lấy một tập tin được mã hóa, vì tập tin có nguồn gốc chứa thông tin nhạy cảm.

Tôi muốn tập lệnh nhắc cụm mật khẩu GPG và sau đó chạy, tìm nguồn cung cấp tệp được mã hóa. Tôi không thể tìm ra làm thế nào để làm điều này mặc dù. Phải có đầu vào của người dùng cho cụm mật khẩu, vì tôi không muốn lưu trữ khóa trên máy chủ với tệp được mã hóa.

Nhìn vào một số phương pháp khác nhau, tôi không muốn giải mã tệp, nguồn tệp không được mã hóa, sau đó xóa nó sau. Tôi muốn giảm cơ hội để lại một tệp không được mã hóa phía sau, nếu có lỗi xảy ra trong tập lệnh.

Có cách nào để lấy đầu ra GPG của một tệp để lấy nguồn theo cách này không? Có thể thu thập STDOUT và phân tích cú pháp (nếu GPG thậm chí có thể xuất nội dung theo cách này).

Ngoài ra, nếu có một cách khác để mã hóa một tập tin mà shell script có thể sử dụng, tôi không biết về nó, nhưng mở ra các khả năng khác.

Câu trả lời:


16

Bạn có thể làm điều này bằng cách sử dụng thay thế quá trình .

. <(gpg -qd "$encrypted_filename")

Đây là một ví dụ:

% cat > to-source <<< 'echo "Hello"'
% . ./to-source                     
Hello
% gpg -e -r chris@chrisdown.name to-source
% . <(gpg -qd to-source.gpg)
Hello

gpg -dkhông duy trì tập tin vào đĩa, nó chỉ xuất nó ra thiết bị xuất chuẩn. <()sử dụng một FIFO , điều này cũng không dẫn đến dữ liệu tệp thực tế được ghi vào đĩa.

Trong bash, .sourcelà từ đồng nghĩa, nhưng .dễ mang theo hơn (đó là một phần của POSIX), vì vậy tôi đã sử dụng nó ở đây. Tuy nhiên, lưu ý rằng đó <()không phải là di động - theo như tôi biết, nó chỉ được hỗ trợ trong bash, zsh, ksh88 và ksh93. pdksh và mksh có coprocesses có thể có tác dụng tương tự.


đây là một giải pháp rất hay Nghĩ đến một đường ống có tên, nhưng không muốn quản lý nó. Tôi đã không nhận thức được tôi có thể làm theo cách này.
BriGuy

Tất nhiên, nếu bạn lo lắng về việc ai đó có thể đọc TẬP TIN tạm thời, với điều này, bạn có cùng lo lắng với việc ai đó có thể đọc được đường ống tạm thời được tạo bởi <(command).
Zan Lynx

@ZanLynx Câu hỏi nêu rõ rằng đây là về việc không tồn tại trên đĩa. Giải pháp để thực hiện việc này một cách an toàn khác cũng giống như mọi nơi khác: sử dụng người dùng chỉ bạn kiểm soát và thực hiện trên hệ thống chỉ có bạn có quyền root.
Chris Xuống

1
Bạn cũng có thể thực hiện việc này với tệp được mã hóa aescrypt (mà tôi đã làm): . <(aescrypt -d -o - file.aes)
Freedom_Ben

3

Nếu bạn đã gpg-agentthiết lập đúng cách, sử dụng pinentry-ttyhoặc một số phiên bản khác không gây ô nhiễm stdin / stdout, thì bạn sẽ có thể làm một cái gì đó như:

source <( gpg --decrypt file.gpg )

Điều này sử dụng thay thế quá trình để cung cấp kết quả sourcenhư thể đó là một tệp. Dữ liệu tệp cụ thể sẽ biến mất ngay sau khi shell được thực hiện với nó, mặc dù vậy bạn vẫn cần cẩn thận với dữ liệu nhạy cảm trong bộ nhớ của shell sau đó.


0

Vì câu trả lời lành mạnh nhất đã được đưa ra, đây là một câu trả lời điên rồ - sử dụng hệ thống tập tin này:

https://github.com/jseppanen/gpgfs

Bằng cách này, chương trình của bạn sẽ không nhận thấy nó đang nói chuyện với một đường ống.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.