Como enviar valor de variável ao pipe enquanto o oculta da lista de processos?

1

Estou escrevendo um script de shell simples que lê um PIN uma vez (em uma variável) e o usa para chamar vários comandos que precisam desse pin. É possível instruir esses comandos para ler o PIN de stdin, mas não sei como enviar o valor da variável para um pipe sem revelá-lo em uma lista de processos. O modo usual - usando echo "$PIN" - executaria uma substituição para que o valor do PIN fosse visível para outros usuários por meio da lista de processos.

Existe um comando que aceita um nome de variável e produz o valor dessa variável para stdout? Ou existe alguma outra maneira?

    
por calavera.info 13.09.2017 / 11:22

1 resposta

3

Como echo está embutido em todos os shells, ele não será exibido na lista de processos.

No entanto, não é confiável para dados arbitrários

Você pode usar printf '%s\n' "$PIN" para algo mais confiável, mas note que alguns shells baseados em pdksh ainda não possuem printf builtin. O trabalho em torno deles é usar print -r -- "$PIN" . print está disponível em zsh e todas as implementações de ksh , mas não é um comando padrão.

Você também pode usar um documento aqui:

cmd << EOF
$PIN
EOF

(ou aqui-string ( cmd <<< "$PIN" ) em zsh e alguns outros shells agora). Mas observe que com a maioria das implementações, os documentos aqui são implementados com arquivos temporários, portanto, o PIN pode ser recuperado offline se o arquivo foi confirmado em disco.

É melhor não exportar PIN para o ambiente se você puder evitá-lo, pois é mais facilmente detectável por outros processos (visto em /proc/pid/environ , que processos com o mesmo uid podem ler, embora haja muitas restrições sobre o que pode ler a memória de outro processo). ps em alguns sistemas (raros) também permitem que você veja o ambiente de qualquer processo.

Uma vez no ambiente, em alguns sistemas, há um comando printenv para exibir seu valor:

printenv PIN

Ou você sempre pode usar perl :

perl -le 'print $ENV{PIN}'
    
por 13.09.2017 / 11:32