Executar um script on-line graciosamente

1

Contexto

Eu configurei um site para postar scripts para que eu possa executar mais tarde usando o seguinte comando:

curl -so /tmp/script http://scripts.programster.org/scripts/1?output=raw && . /tmp/script

Este script de exemplo produz "hello world" para o terminal.

Como você pode ver, isso é bastante longo e confuso e corre o risco de substituir o arquivo de um usuário se ele tiver um arquivo chamado /tmp/script . Eu costumava canalizar para bater assim:

curl -s http://scripts.programster.org/scripts/1?output=raw | bash

No entanto, eu quero que o comando trabalhe com scripts escritos em outras linguagens, como o PHP (usando #!/usr/bin/php no topo do script), daí a mudança para o primeiro comando.

Pergunta

Existe uma maneira de executar um script on-line sem precisar salvá-lo no sistema de arquivos local, além de não saber em que programa executá-lo antes? Talvez exista uma maneira de tratar um URL como um arquivo que me permita fazer algo como:

. http://scripts.programster.org/scripts/1?output=raw
    
por Programster 14.03.2016 / 00:07

1 resposta

3

Além de questões de segurança, espero que você perceba os riscos de executar scripts externos. Isso pode ser feito pela combinação do comando wget e source (dot)

. <(wget -q -O- http://scripts.programster.org/scripts/1?output=raw)

Isso significa fornecer o texto do script para o shell atual

wget -O- faz download ot STDOUT, -q faz com que fique quieto (livre de mensagens)

<(any command) é a substituição do processo que permite interpretar a saída como um arquivo

P.S. curl - equivalente para wget -q -O- is curl -s -o-

UPDATE

Os exemplos acima não farão uso do she-bang do script externo, mas serão executados no contexto do shell de chamada. Para fazer uso da linha she-bang, um tem que salvar o arquivo, tornar executável e só depois executá-lo.

Você pode usar mktemp , o que garantirá nomes não exclusivos, então você terá que remover arquivos temporários. Isso pode ser combinado em um wrapper que usaria o URL externo como parâmetro

Aqui está um exemplo de código de trabalho para esse tipo de wrapper

#/bin/bash
exturl=${1?"No external url specified"}
tmpexe=$(mktemp)
trap 'rm $tmpexe' EXIT
curl -s $exturl  -o $tmpexe
chmod 0755 $tmpexe
$tmpexe
    
por 14.03.2016 / 08:34

Tags