AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 487028
Accepted
user325067
user325067
Asked: 2018-12-10 17:08:26 +0800 CST2018-12-10 17:08:26 +0800 CST 2018-12-10 17:08:26 +0800 CST

Imprimir somas SHA sem "-" no final?

  • 772

É possível imprimir somas SHA sem o -anexo ao final?

$ echo test | sha1sum 
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83  -  <--- this "-" dash/hyphen

Eu sei que podemos usar awke outras ferramentas de linha de comando, mas isso pode ser feito sem usar outra ferramenta ?

$ echo test | sha1sum | awk '{print $1}'
4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
command-line command
  • 6 6 respostas
  • 10854 Views

6 respostas

  • Voted
  1. Joe Maffei
    2020-06-19T11:37:07+08:002020-06-19T11:37:07+08:00

    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:

    echo test | sha1sum | head -c 40
    

    Fonte: https://stackoverflow.com/a/14992739/4642023

    • 11
  2. Best Answer
    Michael Prokopec
    2018-12-10T17:47:03+08:002018-12-10T17:47:03+08:00

    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.

    • 6
  3. James Northrup
    2019-09-02T10:04:56+08:002019-09-02T10:04:56+08:00

    no bash, sem ferramentas extras.

    h=($(echo test | sha1sum )) ;echo $h 
    
    4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
    

    ou

     h=( `echo test | sha1sum` ) ;echo $h 
    

    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

     h=`echo test | sha1sum` ;echo ${h// */} 
    

    ou posix shell (sh, dash, bash) para descartar um sufixo com%

    h=`echo test | sha1sum` ;echo ${h%-}
    

    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

     h=($(echo test | sha1sum )) ;echo $h|xxd -r -p |base64
    ThJDvSLGbnbCup7dwfkTlOV/n4M=
    
    • 5
  4. user232326
    2018-12-11T03:35:43+08:002018-12-11T03:35:43+08:00

    Nova linha

    Entenda que o eco está adicionando uma nova linha no final que altera o hash:

     $ echo test | sha1sum
     4e1243bd22c66e76c2ba9eddc1f91394e57f9f83  -
    
     $ echo -n test | sha1sum
     a94a8fe5ccb19ba61c4c0873d391e987982fbbd3  -
    

    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 um binaryhash (útil no DOS):

     $ echo "hello" >'a\file'
     $ md5sum -b 'a\file'
     \b1946ac92492d2347c6235b4d2611184 *a\\file
    

    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

     $ echo "test" | perl -le 'use Digest::SHA qw(sha1_hex); print sha1_hex(<>);'
     4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
    

    Ou (para uma entrada mais longa, menos memória usada), escreva em um arquivo (vamos chamá-lo de sha1.perl):

     use Digest::SHA qw(sha1_hex);
     $state = Digest::SHA->new(sha1);
     for (<>) { $state->add($_) }
     print $state->hexdigest, "\n";
    

    Execute:

     $ echo "test" | perl sha1.perl 
     4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
    

    php

     $ echo "test" | php -r '$f = fgets(STDIN);  echo sha1($f),"\n";'
     4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
    

    Pitão

    Escreva isso em um arquivo (vamos chamá-lo de sha1.py):

     import hashlib
         m = hashlib.sha1()
    
     import sys
    
     for line in sys.stdin:
         m.update(line)
    
     print m.hexdigest()
    

    Use-o:

     $ echo "test" | python sha1.py
     4e1243bd22c66e76c2ba9eddc1f91394e57f9f83
    
    • 4
  5. Fifi Gaia
    2021-04-28T14:37:13+08:002021-04-28T14:37:13+08:00

    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.

    $ echo -n "hello" | sha256sum | tr -d "\n *-"
    2cf24dba5fb0a30e26e83b2ac5b9e29e1b161e5c1fa7425e73043362938b9824
    
    • 2
  6. 0cd
    2021-03-11T18:18:27+08:002021-03-11T18:18:27+08:00

    Você pode usar printf, como

    printf `printf test | sha1sum`
    

    Aqui o interior printfalimenta a entrada em sha1sum. A saída disso, que se divide bem em params, é passada como dois params para o outer printf, que imprime o primeiro param (que é o valor de hash)

    A vantagem de usar printfover echo+ 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.

    • 0

relate perguntas

  • Como uso `at` para agendar um script para execução no macOS?

  • Qual é a interface recomendada para um utilitário que requer muitos parâmetros? [fechado]

  • Execute o aplicativo X remotamente, execute a GUI no host remoto [fechado]

  • Fazendo mysql CLI me pedir uma senha interativamente

  • Pub / sub de linha de comando sem um servidor?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    ssh Não é possível negociar: "nenhuma cifra correspondente encontrada", está rejeitando o cbc

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    Como descarregar o módulo do kernel 'nvidia-drm'?

    • 13 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add retorna com: "Erro ao conectar ao agente: nenhum arquivo ou diretório" 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya Por que o Linux usa LF como caractere de nova linha? 2017-12-20 05:48:21 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve