Os argumentos do processo são visíveis para todos os usuários, mas o ambiente é visível apenas para o mesmo usuário ( pelo menos no Linux , e acho que em todas as variantes modernas do unix). Portanto, passar uma senha por uma variável de ambiente é seguro. Se alguém puder ler suas variáveis de ambiente, ele poderá executar processos como você, então já acabou o jogo.
O conteúdo do ambiente corre algum risco de vazar indiretamente, por exemplo, se você correr ps
para investigar algo e colar e copiar acidentalmente o resultado, incluindo variáveis de ambiente confidenciais em um local público. Outro risco é que você passa a variável de ambiente para um programa que não precisa dela (incluindo filhos do processo que precisa da senha) e esse programa expõe suas variáveis de ambiente porque não espera que sejam confidenciais. A gravidade desses riscos de vazamento secundário depende de qual é o processo com a senha (por quanto tempo é executado? Executa subprocessos?).
É mais fácil garantir que a senha não vaze acidentalmente, passando-a por um canal que não foi projetado para ser espionado, como um cano. Isso é muito fácil de fazer no lado de envio. Por exemplo, se você tiver a senha em uma variável do shell, poderá fazer
echo "$password" | theprogram
se theprogram
espera a senha em sua entrada padrão. Observe que isso é seguro porque echo
é um builtin; não seria seguro com um comando externo, pois o argumento seria exposto na ps
saída. Outra maneira de obter o mesmo efeito é com um documento aqui:
theprogram <<EOF
$password
EOF
Alguns programas que exigem uma senha podem ser instruídos para lê-la em um descritor de arquivo específico. Você pode usar um descritor de arquivo diferente da entrada padrão se precisar de entrada padrão para outra coisa. Por exemplo, com gpg
:
get-encrypted-data | gpg --passphrase-fd 3 --decrypt … 3<<EOP >decrypted-data
$password
EOP
Se o programa não pode ser instruído a ler a partir de um descritor de arquivo, mas pode ser instruído a ler a partir de um arquivo, você pode instruí-lo a ler a partir de um descritor de arquivo usando um nome de arquivo como `/ dev / fd / 3.
theprogram --password-from-file=/dev/fd/3 3<<EOF
$password
EOF
No ksh, bash ou zsh, você pode fazer isso de forma mais concisa através da substituição do processo.
theprogram --password-from-file=<(echo "$password")