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 / ubuntu / Perguntas / 899847
Accepted
maqp
maqp
Asked: 2017-04-04 11:11:19 +0800 CST2017-04-04 11:11:19 +0800 CST 2017-04-04 11:11:19 +0800 CST

script wget, mas canalize-o para o bash apenas se SHA256 do script corresponder a uma linha

  • 772

wget http://example.com/install.sh -O - | bashexecuta o script automaticamente, mas devido a possíveis ataques MITM (TLS), etc., isso não é seguro. É possível construir um one-liner que baixe o script, mas o execute apenas se seu hash corresponder ao especificado no one-liner? Seria bom se o one-liner imprimisse algo como Warning! Hash mismatchse a verificação de hash falhasse.

command-line
  • 2 2 respostas
  • 4409 Views

2 respostas

  • Voted
  1. Best Answer
    Byte Commander
    2017-04-04T13:55:15+08:002017-04-04T13:55:15+08:00

    Então você quer baixar e executar http://example.com/install.sh.

    Por enquanto, suponho que você tenha seu hash SHA256 armazenado localmente em um arquivo chamado my-sha256.txt. O arquivo contém apenas o próprio hash e um caractere de quebra de linha no estilo Unix, portanto, seu tamanho deve ser exatamente 65 bytes. Você pode criá-lo simplesmente executando isto:

    sha256sum ORIGINAL_FILE.SH | grep -Eo '^\w+' > my-sha256.txt
    

    Como você distribui este arquivo hash de sua máquina de desenvolvimento para o cliente não faz parte desta resposta (ainda, você pode esclarecer sua pergunta e me pedir para atualizar esta parte com base em suas especificações detalhadas).


    O comando real que seu cliente deve executar para baixar, verificar e, em caso de sucesso, executar o script pode ser assim:

    t=$(mktemp) && wget 'http://example.com/install.sh' -qO "$t" && if sha256sum "$t" | grep -Eo '^\w+' | cmp -s my-sha256.txt ; then bash "$t" ; else echo FAIL ; fi ; rm "$t"
    

    Versão ligeiramente abreviada e feia sem espaços em branco:

    t=$(mktemp)&&wget 'http://example.com/install.sh' -qO"$t"&&if sha256sum "$t"|grep -Eo '^\w+'|cmp -s my-sha256.txt;then bash "$t";else echo FAIL;fi;rm "$t"
    

    Colocado em várias linhas para facilitar a leitura:

    t=$(mktemp) && 
    wget 'http://example.com/install.sh' -qO "$t" && 
    if sha256sum "$t" | grep -Eo '^\w+' | cmp -s my-sha256.txt 
        then bash "$t" 
        else echo FAIL 
    fi 
    rm "$t"
    

    Se você deseja fornecer diretamente o hash dentro do comando como string em vez de ler de um arquivo, basta usar uma das minhas versões de comando originais acima e substituir a ocorrência de my-sha256.txtpor <(echo YOUR_HASH), inserindo seu hash real em vez do espaço reservado "SEU_HASH", é claro.

    Explicação:

    O script/one-liner primeiro cria um arquivo temporário usando mktemp(usa a pasta temporária do sistema /tmp).
    Em seguida, ele usa wgetpara baixar o script de instalação do URL especificado e salvá-lo no arquivo temporário.
    Agora calculamos sua soma de hash, filtramos apenas o valor de hash da saída de sha256sume comparamos com o que armazenamos em out my-sha256.txt.
    Se ambos os hashes forem iguais, invocaremos bashcom nosso arquivo de script temporário como argumento, caso contrário, nós echo FAILou você poderemos gerar uma mensagem de erro personalizada.
    No final, limpamos excluindo nosso arquivo temporário em ambos os casos.


    Porém, voltando ao problema de distribuir o hash com segurança para verificar o script original, esta solução acima não vai te ajudar muito, pois resolve um problema criando outro do mesmo tipo.

    O que você realmente deve fazer é criar um par de chaves GPG (e publicar sua chave pública em um servidor de chaves), assinar seu script com ele e oferecer o binário assinado compactado para download. Em seguida, deixe o cliente verificar e descriptografar o script usando gpgnovamente e execute-o com sucesso.

    • 7
  2. maqp
    2018-03-01T09:54:37+08:002018-03-01T09:54:37+08:00

    Como as impressões digitais GPG usam hash SHA-1 inseguro , aqui está uma linha única que permite a autenticação com hash SHA256 não oficial calculado a partir da chave pública com

    gpg --export <key ID> | sha256sum

    comando:

    h="<SHA256 hash of exported public key>"; fp="<PGP key SHA1 fingerprint>"; f='key.pub'; gpg --keyserver pgp.mit.edu --recv $fp && gpg --export $fp > $f && if sha256sum $f | grep -Eo '^\w+' | cmp -s <(echo $h); then rm $f && wget https://example.com/install.sh{,.asc} -q && gpg --verify install.sh{.asc,} && bash install.sh; else rm $f; echo "ERROR: Signing key had invalid SHA256 hash"; fi;

    • 0

relate perguntas

Sidebar

Stats

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

    Existe um comando para listar todos os usuários? Também para adicionar, excluir, modificar usuários, no terminal?

    • 9 respostas
  • Marko Smith

    Como excluir um diretório não vazio no Terminal?

    • 4 respostas
  • Marko Smith

    Como descompactar um arquivo zip do Terminal?

    • 9 respostas
  • Marko Smith

    Como instalo um arquivo .deb por meio da linha de comando?

    • 11 respostas
  • Marko Smith

    Como instalo um arquivo .tar.gz (ou .tar.bz2)?

    • 14 respostas
  • Marko Smith

    Como listar todos os pacotes instalados

    • 24 respostas
  • Martin Hope
    Flimm Como posso usar o docker sem sudo? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    led-Zepp Como faço para salvar a saída do terminal em um arquivo? 2014-02-15 11:49:07 +0800 CST
  • Martin Hope
    ubuntu-nerd Como descompactar um arquivo zip do Terminal? 2011-12-11 20:37:54 +0800 CST
  • Martin Hope
    TheXed Como instalo um arquivo .deb por meio da linha de comando? 2011-05-07 09:40:28 +0800 CST
  • Martin Hope
    Ivan Como listar todos os pacotes instalados 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    David Barry Como determino o tamanho total de um diretório (pasta) na linha de comando? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher "Os seguintes pacotes foram retidos:" Por que e como resolvo isso? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford Como os PPAs podem ser removidos? 2010-07-30 01:09:42 +0800 CST

Hot tag

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

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