Como usar a alocação tty para executar o GPG através do SSH?

4

Estou tentando criptografar e assinar um arquivo local usando uma instalação de GPG distante por meio do SSH:

pv file | ssh -tt [ssh server] gpg -se -r [receipt key] > file.gpg

O uso da opção double t remove o erro gpg "cannot open '/dev/tty': No such device or address" . No entanto, em vez de ser enviado para a entrada de gpg, o conteúdo a ser criptografado é impresso logo após o prompt da senha do ssh. Então a entrada é fechada, e por isso ela trava no gpg pedindo a senha para desbloquear a chave privada para assinatura (ou a conexão ssh é fechada se o arquivo for muito grande).

Qual é a maneira correta de passar dados para a entrada de um comando interativo executado por meio do SSH?

    
por pedroapero 30.07.2015 / 11:34

1 resposta

3

Piping dados em ssh (como você fez) é o caminho certo de passar dados de entrada para um comando executado via SSH.

O problema aqui é que gpg precisa de dois fluxos de entrada para ler:

  • um (STDIN) para ler os dados a serem criptografados,
  • outro (o terminal interativo /dev/tty ) para ler a senha (e é por isso que você precisa passar a opção -t para ssh ).

Se você combinar os dois e tentar usar STDIN para ambos os propósitos, então uma maneira de sinalizar EOF é necessária para separar as duas entradas. No entanto, ssh também leria o final do arquivo e fecharia o fluxo de entrada encaminhado.

A única solução prática que posso imaginar é salve os dados em um arquivo e, em seguida, criptografe-os usando gpg (requer dois invocações ssh separadas) ::

pv file | ssh ... '(umask 077; cat > file.unencrypted)'
ssh -t ... 'gpg -se -r ... < file.unecrypted > file.gpg; rm -f file.unencrypted'
    
por 16.09.2015 / 15:45

Tags