É possível imprimir somas SHA sem o -
anexo ao final?
$ echo test | sha1sum
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83 - <--- this "-" dash/hyphen
Eu sei que podemos usar awk
e outras ferramentas de linha de comando, mas isso pode ser feito sem usar outra ferramenta ?
$ echo test | sha1sum | awk '{print $1}'
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
Como os hashes sha1sum têm 40 caracteres, você pode canalizar a saída para um comando head e extrair os primeiros 40 caracteres dele:
Fonte: https://stackoverflow.com/a/14992739/4642023
Isso não é possível sem outra ferramenta ou sem editar o script/binário sha1sum real. Quando sha1sum é alimentado com um arquivo, ele imprime o nome do arquivo após a soma. Quando sha1sum não é alimentado com um arquivo ou é usado com um pipe. Ele coloca o - lá como um espaço reservado para indicar que a entrada não era um arquivo.
no bash, sem ferramentas extras.
ou
No bash, isso usa a declaração "Array" de h criando uma matriz multiíndice de tokens. referenciar a variável novamente com $h um array de índice é o mesmo que ${h[0]}
usando a substituição básica do shell
ou posix shell (sh, dash, bash) para descartar um sufixo com
%
também pode ter sucesso, embora usar os arrays seja uma escolha mais intuitiva.
adicionando base64
xxd + base64 pode ser usado para aumentar a entropia (reduzir o número de bits) em intervalos de caracteres imprimíveis
Nova linha
Entenda que o eco está adicionando uma nova linha no final que altera o hash:
Responda
Mas não, não há como fazer sha1sum imprimir apenas o hash. A razão é que a linha é na verdade uma string codificada. A linha pode começar com a
\
e o segundo espaço (sim, existem dois) entre o hash e o nome do arquivo pode se tornar um*
para indicar umbinary
hash (útil no DOS):Portanto, não, não é uma boa ideia tentar analisar essa saída sem entender o que foi dito acima.
Alternativas
Algumas soluções mais simples em outras linguagens são:
perl
Ou (para uma entrada mais longa, menos memória usada), escreva em um arquivo (vamos chamá-lo de
sha1.perl
):Execute:
php
Pitão
Escreva isso em um arquivo (vamos chamá-lo de
sha1.py
):Use-o:
Parece estranho que ninguém tenha mencionado isso, mas acho mais fácil apenas cortar a saída usando o comando "tr". Nada contra bash/perl/python regex, mas eu nunca poderia obtê-los todos sem pesquisar por 5 minutos.
Você pode usar
printf
, comoAqui o interior
printf
alimenta a entrada emsha1sum
. A saída disso, que se divide bem em params, é passada como dois params para o outerprintf
, que imprime o primeiro param (que é o valor de hash)A vantagem de usar
printf
overecho
+ tentando analisar a saída em um array é que ele funciona da mesma forma nos shells mais comuns, como bash, bash (no modo de compatibilidade com sh), zsh, ksh etc., enquanto o comportamento do eco e do array varia entre eles. Além disso, isso é feito usando apenas o shell, nenhum outro programa é necessário.