Leia uma senha com segurança de dentro da substituição do processo?

2

Relacionados:

Li as perguntas acima e ainda não sei como fazer o que preciso.

Eu tenho um comando binário que chamarei de getreport , que faz o seguinte:

  1. Solicitar uma senha (prompt enviado ao stderr)
  2. Leia a senha do stdin.
  3. Imprime dados extensivos para stdout.

Eu tenho outro comando binário para analisar a saída do primeiro comando que chamarei de processreport . No entanto, não funciona com stdin; ele aceitará e processará apenas um arquivo especificado na linha de comando com um sinalizador -i . Ele lê o arquivo, faz as coisas com os dados que lê e mostra os dados sobre o que ele fez. (O comando processreport pode também solicitar uma senha, totalmente separada de getreport .)

Eu quero usar a substituição de processos para tornar isso possível em uma única linha, em vez de exigir que um arquivo temporário mantenha a saída de getreport .

Algo como:

processreport -i <(getreport)

No entanto, eu não sei como fazer getreport ler do terminal a senha que ele requer.

Isso é possível?

    
por Wildcard 03.02.2016 / 05:36

2 respostas

3

{ getreport | 4<&0 <&3 processreport -i /dev/fd/4; } 3<&0

Poderia ser mais simples se você estivesse sempre disposto a ler explicitamente em /dev/tty :

getreport | 3<&0 </dev/tty processreport -i /dev/fd/3

... ou mais, ainda assim, se você souber que stderr sempre será igual a stdin - como ocorre tipicamente em um terminal ...

getreport | 3<&0 <&2 processreport -i /dev/fd/3
    
por 05.02.2016 / 07:25
2

getreport não pode ler do terminal porque é um processo em segundo plano.

man 2 read :

EIO : I/O error.
This will happen for example when the process is in a background process group, tries to read from its controlling terminal, and either it is ignoring or blocking SIGTTIN or its process group is orphaned.

Eu acho que o que você quer não é possível sem alguma quebra de shell. Mas talvez isso esteja mais próximo do que você quer:

mkfifo fifo; read -p "Input for FIFO: " input; echo "$input">fifo &
cat <(read bginput <fifo; echo "$bginput"); rm fifo

Isso obviamente não funciona bem com senhas incorretas e tentativas de leitura.

mkfifo fifo; read -p "Input for FIFO: " input; echo "$input">fifo &
processreport -i <(getreport <fifo); rm fifo
    
por 03.02.2016 / 08:03