Leia e confirme o shell script antes de fazer o pipeline de curl para sh (curl -s [url] | sh)

9

Sempre que eu tiver que executar um script de shell a partir da web curl -s [url] | sh , eu primeiro abro url no meu navegador para garantir que o script não seja malicioso e seja seguro para ser executado.

Eu me lembro de ter visto um truque de linha de comando que fez com que fosse possível ler o script pela linha de comando e confirmar a execução depois de ler o script. Se bem me lembro, parecia algo como curl -s [url] | something...here | sh e não requeria nenhuma instalação de software.

Alguém conhece esse truque?

    
por Olivier Lalonde 25.08.2012 / 02:10

5 respostas

5

Existe um utilitário em moreutils chamado vipe que mostra stdin em um editor, onde você pode renovar e modificar o arquivo antes que ele seja transmitido para o stdout.

Se você não quiser instalar moreutils , poderá realizar algo semelhante da seguinte forma:

file=$(mktemp); curl -s "$url" > $file; $EDITOR $file; sh $file; rm $file

mktemp está em coreutils e é muito provável que já esteja instalado em seu sistema.

    
por 23.01.2013 / 14:56
2

Não consigo pensar em um único utilitário que faça o que você descreve, mas é fácil torná-lo um fragmento de shell.

script=$(curl -s "$url")
printf "%s\nDo you want to run this script? [yN]" "$script"
read line
case $line in
  [Yy]|[Yy][Ee][Ss]) sh -c "$script";;
esac

Isso pressupõe que o script é um arquivo de texto. Bytes nulos não são suportados: dependendo do shell, eles podem ser removidos ou podem fazer com que uma linha ou todo o arquivo seja truncado. Também todas as novas linhas no final do arquivo são removidas (a construção heredoc adiciona uma de volta). Isso normalmente não é um problema para um script, mas pode ser, por exemplo, se o script terminar com um archive em formato binário que ele extrai. Essa não é uma maneira muito confiável de distribuir um arquivo, pois há um risco significativo de que um script binário seja equivocado em algum momento. No entanto, você pode manipulá-lo escrevendo o script em um arquivo temporário.

script_file=$(mktemp)
curl -s "$url" | tee "$script_file"
printf "Do you want to run this script? [yN]"
read line
case $line in
  [Yy]|[Yy][Ee][Ss]) sh "$script_file";;
esac
rm "$script_file"
    
por 26.08.2012 / 01:54
1

É difícil imaginar por que você iria querer fazer isso, e muito menos onde você encontraria uma fonte (ou fontes) de scripts para baixar e rodar assim com freqüência suficiente para que ele precisasse de uma ferramenta de propósito especial.

Por que não basta fazer o download do script com curl (ou wget ou snarf ou qualquer outro), examine e edite (é um script raro que não precisará de alguma personalização para seu sistema específico) e execute-o - seja tornando-o executável com chmod ou com sh scriptname ?

    
por 25.08.2012 / 02:51
0

Use esta linha de comando:

curl URL | ( cat > /tmp/file; read REPLY; [[ ! $REPLY =~ ^[Yy]$ ]] && cat /tmp/file ) | sh

Você poderia usar uma pequena função para isso:

curlsh()
{
    curl "$1" \
    | ( cat > /tmp/file;read REPLY; [[ ! $REPLY =~ ^[Yy]$ ]] && cat /tmp/file ) \
    | sh
}

E então use da seguinte maneira:

curlsh http://site.in.net/path/to/script
    
por 25.08.2012 / 13:31
0

Assumindo que seu read sabe -p (prompt), e o script não precisa ser executado com o interpretador, especificado pelo shebang:

curl URL | tee /tmp/x && read -p "execute?" key ; test $key = y && sh /tmp/x
    
por 24.12.2012 / 04:05