dois comandos canalizados, cada um precisa ler a senha do stdin

4

Existe uma maneira de fazer isso de maneira sensata:

scp user@host:/path/to/file /dev/tty | openssl [options] | less

sem criar um arquivo e sem precisar fornecer senhas diretamente nos argumentos?

O problema é que ambos pedem senha, mas a ordem em que eles iniciam (e, portanto, também a ordem em que pedem a senha) é indefinida.

Não há problema em concluir primeiro scp e depois iniciar openssl , mas sem um arquivo temporário.

Soluções possíveis até o momento

  • coloque a saída de scp na variável e, em seguida, da variável em openssl (seria viável apenas para arquivos pequenos, além de suspeitar que pode haver alguns problemas com dados binários, etc.)
  • insira senhas nos arquivos ( não é bom )
  • usa chaves ( melhor? )
  • use pipes nomeados


Versão de pipes nomeados 1

mkfifo pipe && {
  scp user@host:/path/to/file pipe    # asks for password, then waits
                                      # for read from pipe to finish
                                      # which will only happen after the
                                      # password for openssl was supplied
                                      # => must ^Z and enter the password
                                      #  => 'pipe: Interrupted system call'

  openssl [options] -in pipe | less
}


Named pipes versão 2

mkfifo pipe && {
  scp user@host:/path/to/file pipe &  # asks for password (and works when
                                      # password is entered) despite being 
                                      # put in background (what? how?
                                      #  can someone explain?)

  openssl [options] -in pipe | less   # 'bad password read'
}


Versão de pipes nomeados 3

mkfifo pipe && {
  scp user@host:/path/to/file pipe |  # asks for password first

  openssl [options] -in pipe | less   # asks for password after scp's
                                      # password has been entered
                                      # and everything works fine
}

Mudar os comandos não ajuda.


openssl [options] -in <(scp user@host:/path/to/file /dev/tty) | less não funciona.


Alguém poderia

  1. proponha outra solução,
  2. explique o comportamento incomum do scp em relação ao exemplo 1 ('Interrompida a chamada do sistema') (estou pensando que seja um bug ou algo como um "recurso de segurança"),

  3. explique como a inserção de senhas funciona, por exemplo. como uma tarefa, que foi iniciada em segundo plano, pode ler de stdin,

  4. (relacionado a 3.) explica por que o scp no exemplo 2 imprime a solicitação de senha mesmo que stdout e stderr sejam redirecionados para /dev/null ?


    
por kyrill 03.07.2016 / 17:46

0 respostas