O ideal é que você nunca digite uma senha de texto não criptografado na linha de comando como um argumento para um comando. Isso faz da senha um argumento para o comando, e os argumentos da linha de comando podem ser vistos na tabela de processos usando ferramentas simples como ps
ou conectados a alguns logs de auditoria.
Dito isto, há certamente maneiras de esconder a senha real do histórico de comandos do shell.
sha1pass "$( head -n 1 )"
Em seguida, digite a senha e pressione Enter . O comando head
usado aqui aceita exatamente uma linha de entrada e a última nova linha que você digita não fará parte dos dados que são passados para sha1pass
.
Para evitar que os caracteres ecoem:
sha1pass "$( stty -echo; head -n 1; stty echo )"
O comando stty -echo
desativa o eco dos caracteres digitados no terminal. O eco é então restaurado com stty echo
.
Para passar na entrada padrão, esse último comando poderia ser alterado (você teria feito isso se sha1pass
aceitasse dados na entrada padrão, mas aparecesse como se este utilitário específico estivesse ignorando sua entrada padrão):
{ stty -echo; head -n 1; stty echo; } | somecommand
Se você precisar de entrada de várias linhas (o acima pressupõe que uma única linha deve ser passada, sem caractere de nova linha no final), substitua o comando head
inteiro por cat
e termine a entrada (assumindo somecommand
lê até o fim do arquivo) com Ctrl + D (seguindo Return se você quiser incluir um caractere de nova linha na entrada, ou duas vezes se não). / p>
Isso funcionaria independentemente do shell que você estava usando (desde que fosse um shell tipo Bourne ou rc).
Alguns shells podem ser criados para não salvar os comandos digitados em seus arquivos de histórico se o comando for precedido por um espaço. Isso geralmente envolve ter que definir HISTCONTROL
para o valor ignorespace
. Isto é suportado por pelo menos bash
e ksh
no OpenBSD, mas não por ex. ksh93
ou dash
. zsh
usuários podem usar a opção histignorespace
ou sua variável HISTORY_IGNORE
para definir um padrão a ser ignorado.
Em shells que suportam leitura com read
sem ecoar caracteres para o terminal, você também pode usar
IFS= read -rs password # -s turns off echoing in bash or zsh
# -r for reading backslashes as-is,
# IFS= to preserve leading and trailing blanks
sha1pass "$password"
mas isso obviamente ainda tem o mesmo problema com a possibilidade de revelar a senha na tabela de processos.
Se o utilitário lê da entrada padrão, e se o shell suporta "aqui-strings", o acima pode ser alterado para
IFS= read -rs password
somecommand <<<"$password"
Resumo dos comentários abaixo:
-
Executar um comando com uma senha fornecida na linha de comando, que todos os comandos acima fazem, exceto aquele que envia os dados para o comando, tornará a senha visível para qualquer pessoa que esteja executando ps
em o mesmo tempo. Nenhum dos comandos acima, no entanto, salvará a senha digitada no arquivo de histórico do shell, se executada a partir de um shell interativo.
-
Programas bem comportados que leem senhas em texto simples fazem isso lendo suas entradas padrão, de um arquivo ou diretamente do terminal.
-
sha1pass
requer a senha na linha de comando, digitada diretamente ou usando alguma forma de substituição de comando.
-
Se for possível, use outra ferramenta.