Existe uma maneira de obter um arquivo criptografado (GPG) on-the-fly em um script?

8

Eu preciso de um script bash para criar um arquivo criptografado, pois o arquivo que está sendo originado contém informações confidenciais.

Eu gostaria que o script solicitasse a senha GPG e, em seguida, executasse o código do arquivo criptografado. Eu não consigo descobrir como fazer isso. Deve haver entrada do usuário para a frase secreta, pois não quero armazenar uma chave no servidor com o arquivo criptografado.

Examinando alguns métodos diferentes, não desejo descriptografar o arquivo, fonte do arquivo não criptografado e excluí-lo depois. Eu gostaria de reduzir a chance de deixar um arquivo não criptografado para trás, se algo desse errado no script.

Existe uma maneira de obter a saída GPG de um arquivo para obtê-lo dessa maneira? Possivelmente coletando STDOUT e analisando-o (se o GPG puder produzir o conteúdo dessa maneira).

Além disso, se houver outra maneira de criptografar um arquivo que os shell scripts possam usar, não estou ciente disso, mas estou aberto a outras possibilidades.

    
por BriGuy 22.10.2015 / 17:09

3 respostas

15

Você pode fazer isso usando substituição de processos .

. <(gpg -qd "$encrypted_filename")

Veja um exemplo:

% cat > to-source <<< 'echo "Hello"'
% . ./to-source                     
Hello
% gpg -e -r [email protected] to-source
% . <(gpg -qd to-source.gpg)
Hello

gpg -d não mantém o arquivo em disco, apenas o envia para stdout. <() usa um FIFO , o que também não resulta em dados de arquivos reais escrito em disco.

No bash, . e source são sinônimos, mas . é mais portátil (faz parte do POSIX), então usei aqui. Note, no entanto, que <() não é tão portátil - até onde eu sei, é suportado apenas em bash, zsh, ksh88 e ksh93. pdksh e mksh têm coprocessos que podem ter o mesmo efeito.

    
por 22.10.2015 / 17:14
3

Se você tiver gpg-agent configurado corretamente, usando pinentry-tty ou alguma outra versão que não polua o stdin / stdout, será possível fazer algo como:

source <( gpg --decrypt file.gpg )

Isso usa a substituição de processo para alimentar o resultado para source como se fosse um arquivo. Os dados do arquivo específico desaparecerão assim que o shell terminar, embora você ainda precise ter cuidado com os dados confidenciais na memória do shell depois disso.

    
por 22.10.2015 / 17:15
0

Como a resposta mais sensata já foi dada, aqui está uma insana - use este sistema de arquivos:

link

Desta forma, seu programa não notará que está falando com um pipe.

    
por 23.10.2015 / 00:03